【发布时间】:2013-12-09 14:16:40
【问题描述】:
我正在尝试为日程安排应用执行日期计算,但遇到了夏令时问题。我正在尝试确定两个日期之间的天数:
NSDateComponents *activityComponents = [[NSDateComponents alloc]init];
activityComponents = [self.calendar components:NSDayCalendarUnit
fromDate:self.viewBeginDate
toDate:item.ES
options:0];
NSLog(@"Days: %d and hours: %d", [activityComponents day], [activityComponents hour]);
其中self.viewBeginDate 和item.ES 都是NSDate 对象,self.calendar 是公历。
- 在 2013 年 11 月 1 日至 2013 年 11 月 1 日之间计算时,提供 0。
- 在 2013 年 11 月 1 日和 2013 年 11 月 2 日之间计算时,它提供 1。
- 在 2013 年 11 月 1 日和 2013 年 11 月 3 日之间计算时,它提供 2。
- 在 2013 年 11 月 1 日和 2013 年 11 月 4 日之间计算时,提供 2 再次!
这是我的输出:
Days: 0 and hours: 0
Days: 1 and hours: 0
Days: 2 and hours: 0
Days: 2 and hours: 24
Days: 3 and hours: 23
我希望能够在不受夏令时影响的情况下确定 2 个 NSDate 对象之间的天数,因为我的应用不关心用户所在的本地或时区。我只是希望它告诉我,2013 年 11 月 1 日和 2013 年 11 月 4 日之间有 3 天。有什么想法吗?
我的NSDate 对象是从格式为:2013-11-01 00:00:00 +0000 的字符串创建的。每个日期的时间都设置为 00:00:00,GMT 偏移量为 +0000。
我想到了两种可能的选择:
- 使用
isDaylightSavingTime检查每个日期,如果日期是夏令时,则创建一个新的(修改的)日期偏移量 1 小时。我担心增加的计算时间,因为我的应用程序计算给定开始日期和其他日期数组之间的日期。该数组中最多可包含 2,000 个日期。我不确定这是否是一个合法的问题...... - 创建不受 DST 影响的自定义时区。这甚至可能吗?
【问题讨论】:
-
只需将您的 NSCalendar 设置为 UTC。
-
我已将日历更改为 UTC,结果没有差异。我做对了吗?
[self.calendar setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; -
我用
NSLog(@"%@", [NSTimeZone knownTimeZoneNames]);列出了时区,并在“美国/某某”和“欧洲/某某”甚至格林威治标准时间之类的地方列出了一长串,但我没有看到UTC。不是一直可用吗? -
使用 GMT,它是 UTC 的旧名称。我很惊讶 Apple 没有添加 UTC。
-
或者直接使用
[NSTimeZone timeZoneForSecondsFromGMT:0]
标签: objective-c cocoa nsdate dst nstimezone