Ios NSDateComponents将UTC日期转换为本地时区,弄乱了“;“今天”;nsdate比较
我试图使用NSDateComponents来测试动态日期是否发生在“今天”。我使用它提取年/月/日,然后比较两个日期的值。理论上,这应该是可行的。我在东海岸,所以东部标准时间,UTC为-5 实际当前时间:美国东部时间12:40:53 以下是正确的NSDate(UTC)。时间是正确的UTC:Ios NSDateComponents将UTC日期转换为本地时区,弄乱了“;“今天”;nsdate比较,ios,objective-c,timezone,nsdate,nsdatecomponents,Ios,Objective C,Timezone,Nsdate,Nsdatecomponents,我试图使用NSDateComponents来测试动态日期是否发生在“今天”。我使用它提取年/月/日,然后比较两个日期的值。理论上,这应该是可行的。我在东海岸,所以东部标准时间,UTC为-5 实际当前时间:美国东部时间12:40:53 以下是正确的NSDate(UTC)。时间是正确的UTC: 当前[日期]:2016-01-19 17:40:53+0000 活动日期:2016-01-19 00:00:00+0000 这是我的日志,显示每个日期。它正在将日期转换为本地时区2016-01-19 07
- 当前[日期]:2016-01-19 17:40:53+0000
- 活动日期:2016-01-19 00:00:00+0000
2016-1-19 12:40:53 (America/New_York (EST) offset -18000),
2016-1-18 19:0:0 (America/New_York (EST) offset -18000)
代码:
您正在更改
NSDateComponents
的时区。但在调用组件
(或调用NSCalendar
日检查例程)之前,您希望更改日历的时区,例如:
但是,如果当地时间是2016-01-19 21:00:00-0500
(即UTC的20号),该怎么办。你想让它说,这也是同一天的活动日期在您的例子?如果是这样的话,那么您实际上是在说您希望对\u日期使用本地日历,对活动模型日期使用UTC,例如:
NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *current = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:_date];
calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSDateComponents *activity = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:activityModel.date];
if ([current day] == [activity day] && [current month] == [activity month] && [current year] == [activity year] && [current era] == [activity era]) {
NSLog(@"same");
} else {
NSLog(@"diff");
}
你可以问NSCalendar这个问题。可能比调试日期代码更容易。请参阅-[NSCalendar isDateInToday]
。尝试了以下操作:如果([[NSCalendar current calendar]isDateInToday:activityModel.date]){与我最初的比较方法一样,它仍然失败。但事实上,要简单得多。谢谢。我将从第一个开始,并根据需要调整第二个的更多部分。这比我以前的只加/减12小时以避免午夜UTC滚动问题的老方法要好。
NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
if ([calendar isDate:_date inSameDayAsDate:activityModel.date]) {
NSLog(@"same");
} else {
NSLog(@"diff");
}
NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *current = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:_date];
calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSDateComponents *activity = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:activityModel.date];
if ([current day] == [activity day] && [current month] == [activity month] && [current year] == [activity year] && [current era] == [activity era]) {
NSLog(@"same");
} else {
NSLog(@"diff");
}