今天,昨天,这个星期,上个星期,这个月,上个月... 变量

我正在尝试做的是获取 NSDate 今天,昨天,本周,上周,本月,上个月的变量,为 UITableView 的 title ForHeaderInSection 添加头部的比较做好准备

我想要的是手动完成的代码下面的日期2009年12月11日

 NSDate *today = [NSDate dateWithString:@"2009-12-11 00:00:00 +0000"];
NSDate *yesterday = [NSDate dateWithString:@"2009-12-10 00:00:00 +0000"];
NSDate *thisWeek = [NSDate dateWithString:@"2009-12-06 00:00:00 +0000"];
NSDate *lastWeek = [NSDate dateWithString:@"2009-11-30 00:00:00 +0000"];
NSDate *thisMonth = [NSDate dateWithString:@"2009-12-01 00:00:00 +0000"];
NSDate *lastMonth = [NSDate dateWithString:@"2009-11-01 00:00:00 +0000"];
97122 次浏览

Adapted from the Date and Time Programming Guide:

// Right now, you can remove the seconds into the day if you want
NSDate *today = [NSDate date];


// All intervals taken from Google
NSDate *yesterday = [today dateByAddingTimeInterval: -86400.0];
NSDate *thisWeek  = [today dateByAddingTimeInterval: -604800.0];
NSDate *lastWeek  = [today dateByAddingTimeInterval: -1209600.0];


// To get the correct number of seconds in each month use NSCalendar
NSDate *thisMonth = [today dateByAddingTimeInterval: -2629743.83];
NSDate *lastMonth = [today dateByAddingTimeInterval: -5259487.66];

If you want the correct exact number of days depending on the month, you should use an NSCalendar.

Might be a better way to write this but here what i came up on Ben's NSCalendar suggestion and working from there to NSDateComponents

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond ) fromDate:[[NSDate alloc] init]];


[components setHour:-[components hour]];
[components setMinute:-[components minute]];
[components setSecond:-[components second]];
NSDate *today = [cal dateByAddingComponents:components toDate:[[NSDate alloc] init] options:0]; //This variable should now be pointing at a date object that is the start of today (midnight);


[components setHour:-24];
[components setMinute:0];
[components setSecond:0];
NSDate *yesterday = [cal dateByAddingComponents:components toDate: today options:0];


components = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[[NSDate alloc] init]];


[components setDay:([components day] - ([components weekday] - 1))];
NSDate *thisWeek  = [cal dateFromComponents:components];


[components setDay:([components day] - 7)];
NSDate *lastWeek  = [cal dateFromComponents:components];


[components setDay:([components day] - ([components day] -1))];
NSDate *thisMonth = [cal dateFromComponents:components];


[components setMonth:([components month] - 1)];
NSDate *lastMonth = [cal dateFromComponents:components];


NSLog(@"today=%@",today);
NSLog(@"yesterday=%@",yesterday);
NSLog(@"thisWeek=%@",thisWeek);
NSLog(@"lastWeek=%@",lastWeek);
NSLog(@"thisMonth=%@",thisMonth);
NSLog(@"lastMonth=%@",lastMonth);

I really like the THCalendarInfo object contained in this project:

http://github.com/jaredholdcroft/kcalendar

I can't quite find the original. Using this object you can move to a previous day, the start of a week, the start of a month, get the day of a week, the day of a month... etc. etc.

NSDateComponents is nice to get today:

NSCalendar *cal = [NSCalendar currentCalendar];


NSDate *date = [NSDate date];
NSDateComponents *comps = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
fromDate:date];
NSDate *today = [cal dateFromComponents:comps];

This creates a NSDate with only year, month and date:

(gdb) po today
2010-06-22 00:00:00 +0200

To get yesterday, etc. you can calculate it using NSDateComponents:

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:-1];
NSDate *yesterday = [cal dateByAddingComponents:components toDate:today options:0];
NSDate *today = [[NSDate alloc] initWithTimeIntervalSinceNow:0];
+ (NSDate*)dateFor:(enum DateType)dateType {


NSCalendar *calendar = [NSCalendar currentCalendar];


NSDateComponents *comps =
[calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
fromDate:[NSDate date]];


if(dateType == DateYesterday) {


comps.day--;
}
else if(dateType == DateThisWeek) {


comps.weekday = 1;
}
else if(dateType == DateLastWeek) {


comps.weekday = 1;
comps.week--;
}
else if(dateType == DateThisMonth) {


comps.day = 1;
}
else if(dateType == DateLastMonth) {


comps.day = 1;
comps.month--;
}
else if(dateType != DateToday)
return nil;


return [calendar dateFromComponents:comps];
}
NSDate *today = [NSDate date]; // Today's date
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *weekdayComponents =[gregorian componentsNSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];
NSInteger day = [weekdayComponents day];

The other answers just didn't work for me (maybe because of my time zone). This is how I do it:

- (BOOL)isOnThisWeek:(NSDate *)dateToCompare
{
NSCalendar * calendar = [NSCalendar currentCalendar];
NSDate     * today    = [NSDate date];


int todaysWeek        = [[calendar components: NSWeekCalendarUnit fromDate:today] week];
int dateToCompareWeek = [[calendar components: NSWeekCalendarUnit fromDate:dateToCompare] week];


int todaysYear         = [[calendar components:NSYearCalendarUnit fromDate:today] year];
int dateToCompareYear  = [[calendar components:NSYearCalendarUnit fromDate:dateToCompare] year];


if (todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear) {
return YES;
}


return NO;
}

Swift 4.2

let today = Date()
let yesterday = today.addingTimeInterval(-86400.0)
let thisWeek = today.addingTimeInterval(-604800.0)
let lastWeek = today.addingTimeInterval(-1209600.0)


let thisMonth = today.addingTimeInterval(-2629743.83)
let lastMonth = today.addingTimeInterval(-5259487.66)


// components of the date
let calendar = Calendar(identifier: Calendar.Identifier.gregorian)
let components = calendar.dateComponents([.year, .month, .day], from: today)
let (year, month, day) = (components.year, components.month, components.day)

Please note that date components are optional.

This is for check the date is this month or not

func isOnThisMonth(dateToCompare: NSDate) -> Bool {
let calendar: NSCalendar = NSCalendar.currentCalendar()
let today: NSDate = NSDate()
let todaysWeek: Int = calendar.components(NSCalendarUnit.Month, fromDate: today).month
let dateToCompareWeek: Int = calendar.components(.Month, fromDate: dateToCompare).month
let todaysYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: today).year
let dateToCompareYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: dateToCompare).year
if todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear {
return true
}
return false
}

And second one only change type of calendarUnit for weak like this

func isOnThisWeek(dateToCompare: NSDate) -> Bool {
let calendar: NSCalendar = NSCalendar.currentCalendar()
let today: NSDate = NSDate()
let todaysWeek: Int = calendar.components(NSCalendarUnit.Weekday, fromDate: today).weekday
let dateToCompareWeek: Int = calendar.components(.Weekday, fromDate: dateToCompare).weekday
let todaysYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: today).year
let dateToCompareYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: dateToCompare).year
if todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear {
return true
}
return false
}

I hope this is helpful to someone Thanks.

I answered a similar question already and here's why my answer is better:

  • Swift 3!
  • Utilizes DateFormatter's "Yesterday" and "Today". This is already translated by Apple, which saves you work!
  • Uses DateComponentsFormatter's already translated "1 week" string. (Again less work for you, courtesy of Apple.) All you have to do is translate the "%@ ago" string. 🙂
  • The other answers incorrectly calculate the time when the day switches from "today" to "yesterday" to etc. Fixed constants are a big NO-NO because reasons. Also, the other answers use the current date/time when they should use the end of the current day's date/time.
  • Uses autoupdatingCurrent for Calendar & Locale which ensures your app is immediately up to date with the user's calendar and language preferences in Settings.app

If you're using iOS 10+ or MacOS 10.12+, you can use these two Calendar methods to do this properly.

  • func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date? (docs)
  • func dateInterval(of component: Calendar.Component, for date: Date) -> DateInterval? (docs)

Here's an example of how to use these methods in Swift 3, along with the playgrounds output in my time zone.

let calendar = Calendar.current
let now = Date()
// => "Apr 28, 2017, 3:33 PM"


let yesterday = calendar.date(byAdding: .day, value: -1, to: now)
// => "Apr 29, 2017, 3:33 PM"
let yesterdayStartOfDay = calendar.startOfDay(for: yesterday!)
// => ""Apr 29, 2017, 12:00 AM"


let thisWeekInterval = calendar.dateInterval(of: .weekOfYear, for: now)
// => 2017-04-23 04:00:00 +0000 to 2017-04-30 04:00:00 +0000


let thisMonthInterval = calendar.dateInterval(of: .month, for: now)
// => 2017-04-01 04:00:00 +0000 to 2017-05-01 04:00:00 +0000


let aDateInLastWeek = calendar.date(byAdding: .weekOfYear, value: -1, to: now)
let lastWeekInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastWeek!)
// => 2017-04-16 04:00:00 +0000 to 2017-04-23 04:00:00 +0000


let aDateInLastMonth = calendar.date(byAdding: .month, value: -1, to: now)
let lastMonthInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastMonth!)
// => 2017-03-26 04:00:00 +0000 to 2017-04-02 04:00:00 +0000

Bonus: You can use the DateIntervals to test whether a date falls in that range. Continuing from above:

thisWeekInterval!.contains(now)
// => true
lastMonthInterval!.contains(now)
// => false