Я пытаюсь сделать это, чтобы получить NSDate сегодня, вчера, на этой неделе, на прошлой неделе, в этом месяце, переменные последнего месяца, готовые для сравнения для заголовков, которые будут добавлены в заголовок UITableView titleForHeaderInSection
То, что я хочу, сделано вручную в приведенном ниже коде на дату 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"];
iphone
time
comparison
nsdate
Хаснат
источник
источник
NSCalendar
если требуется точность.Возможно, это лучший способ написать это, но вот что я придумал по предложению Бена NSCalendar и работал оттуда с 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);
источник
fromDate:[[NSDate alloc] init]
битов вы полностью теряете память .NSDateComponents приятно получить сегодня:
NSCalendar *cal = [NSCalendar currentCalendar]; NSDate *date = [NSDate date]; NSDateComponents *comps = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date]; NSDate *today = [cal dateFromComponents:comps];
Это создает NSDate только с годом, месяцем и датой:
(gdb) po today 2010-06-22 00:00:00 +0200
Чтобы получить вчерашний день и т.д., вы можете рассчитать его с помощью NSDateComponents:
NSDateComponents *components = [[NSDateComponents alloc] init]; [components setDay:-1]; NSDate *yesterday = [cal dateByAddingComponents:components toDate:today options:0];
источник
(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
должно быть(NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
.+ (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]; }
источник
DateThisWeek
, установка дня недели не влияет на NSDate ...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)
Обратите внимание, что компоненты даты не являются обязательными.
источник
Другие ответы просто не сработали для меня (возможно, из-за моего часового пояса). Вот как я это делаю:
- (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; }
источник
Если вы используете iOS 10+ или MacOS 10.12+, вы можете использовать эти два
Calendar
метода, чтобы сделать это правильно.func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date?
( документы )func dateInterval(of component: Calendar.Component, for date: Date) -> DateInterval?
( документы )Вот пример того, как использовать эти методы в Swift 3 вместе с выводом игровых площадок в моем часовом поясе.
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
Бонус: вы можете использовать
DateInterval
s, чтобы проверить, попадает ли дата в этот диапазон. Продолжая сверху:thisWeekInterval!.contains(now) // => true lastMonthInterval!.contains(now) // => false
источник
yesterday
написано 29 апреля, аnow
сказано 28 апреля?NSDate *today = [NSDate date]; // Today's date NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *weekdayComponents =[gregorian componentsNSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today]; NSInteger day = [weekdayComponents day];
источник
Мне очень нравится объект THCalendarInfo, содержащийся в этом проекте:
http://github.com/jaredholdcroft/kcalendar
Я не могу найти оригинал. Используя этот объект, вы можете перейти к предыдущему дню, началу недели, началу месяца, получить день недели, день месяца ... и т. Д. И т. Д.
источник
NSDate *today = [[NSDate alloc] initWithTimeIntervalSinceNow:0];
источник
[NSDate date]
?Это для проверки, дата в этом месяце или нет
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 }
А второй - только изменить тип CalendarUnit для слабых вроде этого
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 }
Надеюсь, это кому-то поможет. Спасибо.
источник
Я отвечал на подобный вопрос уже , и вот почему мой ответ лучше:
источник