Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSDateComponents将UTC日期转换为本地时区,弄乱了“;“今天”;nsdate比较_Ios_Objective C_Timezone_Nsdate_Nsdatecomponents - Fatal编程技术网

Ios NSDateComponents将UTC日期转换为本地时区,弄乱了“;“今天”;nsdate比较

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

我试图使用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:00:00。由于目前的日期是在一天中,5小时的偏移量不会导致它转移天。然而,午夜的那一天又回到了前一天。我如何才能让它尊重UTC

NSLog:

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");
}