#iphone #cocoa #nsdate
#iPhone #cocoa #nsdate
Вопрос:
Знаете ли вы, как узнать, относятся ли два NSDate к одному и тому же дню. NSDate
Я хочу принять во внимание локаль…
Могло бы быть легко использовать timeIntervalSinceDate:
, но понедельник 23: 58 и вторник 00: 01 не приходятся на один и тот же день…
Разобраться с NSDate
и locale для вычисления не очень просто.
Ответ №1:
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *componentsForFirstDate = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:firstDate];
NSDateComponents *componentsForSecondDate = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:secondDate];
if ([componentsForFirstDate year] == [componentsForSecondDate year])
и т.д.
Я не знаю, isEquals
будет ли делать то, что вы хотите на NSDateComponents
.
Комментарии:
1. [NSCalendar currentCalendar] выполняется мучительно медленно, поэтому по возможности кэшируйте его.
2. Спасибо за ответ. Что вы подразумеваете под «кэшированием» currentCal? Я поместил это в синглтон?
3. Или создайте категорию в NSCalendar, где результат currentCalendar сохраняется как статическая переменная.
4. Начиная с iOS 7
[NSCalendar currentCalendar]
кэшируется ОС, поэтому больше нет необходимости кэшировать локально.
Ответ №2:
Начиная с iOS 8, это просто:
let isSameDay = NSCalendar.currentCalendar().isDate(date1, inSameDayAsDate: date2)
и это становится еще немного проще с Swift 3:
let isSameDay = Calendar.current.isDate(date1, inSameDayAs: date2)
Ответ №3:
Для этого используйте NSCalendar и NSDateComponents:
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *comps1 = [cal components:(NSMonthCalendarUnit| NSYearCalendarUnit | NSDayCalendarUnit)
fromDate:date1];
NSDateComponents *comps2 = [cal components:(NSMonthCalendarUnit| NSYearCalendarUnit | NSDayCalendarUnit)
fromDate:date2];
BOOL sameDay = ([comps1 day] == [comps2 day]
amp;amp; [comps1 month] == [comps2 month]
amp;amp; [comps1 year] == [comps2 year]);
Ответ №4:
Swift:
func isSameDays(date1:NSDate, _ date2:NSDate) -> Bool {
let calendar = NSCalendar.currentCalendar()
var comps1 = calendar.components([NSCalendarUnit.Month , NSCalendarUnit.Year , NSCalendarUnit.Day], fromDate:date1)
var comps2 = calendar.components([NSCalendarUnit.Month , NSCalendarUnit.Year , NSCalendarUnit.Day], fromDate:date2)
return (comps1.day == comps2.day) amp;amp; (comps1.month == comps2.month) amp;amp; (comps1.year == comps2.year)
}
Ответ №5:
Сделайте это с помощью NSDateFormatter :
NSDateFormatter *_df = [[NSDateFormatter alloc] init];
_df.dateFormat = @"yyyy.MM.dd";
NSString *_d1 = [_df stringFromDate:_date1];
NSString *_d2 = [_df stringFromDate:_date2];
if ([_d1 isEqualToString:_d2] == YES)
{
// d1 and d2 is on same day/month/year
}
[_df release];
Ответ №6:
Если ваше приложение будет работать только в OS X 10.9 или iOS 8 , вы можете использовать новые API NSCalender
.
/*
This API compares the given dates down to the given unit, reporting them equal if they are the same in the given unit and all larger units.
*/
- (BOOL)isDate:(NSDate *)date1 equalToDate:(NSDate *)date2 toUnitGranularity:(NSCalendarUnit)unit NS_AVAILABLE(10_9, 8_0);
Также существует множество удобных API. Однако Apple не упомянула их в своем наборе документов. В любом случае, API являются общедоступными, и вы можете их использовать.
Ответ №7:
Установите часовой пояс, если дата не соответствует системному языку.
NSCalendar *calendar = [NSCalendar currentCalendar];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:self.cityData.timeZone];
[calendar setTimeZone:timeZone];
NSDateComponents *componentsForFirstDate = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:weatherDataDate];
NSDateComponents *componentsForSecondDate = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:yesterday];
if ([componentsForFirstDate day] == [componentsForSecondDate day]) {
// TODO:
}