使用NSDate对我来说很棘手。我知道它代表一个特定的时间点,不依赖于特定的时区或地区。我还阅读了很多关于NSDateFormatter,NSCalendar,NSDateComponents,NSlocale和NSTimeZone的文档。
我正在尝试根据两个特定的太平洋时区进行计算。例如,我希望能够计算从日期A到日期B的天数。我不想通过解析字符串来“破解”它,因为我想要计算像DST这样的东西。
有人可以推荐一种方法吗?
编辑:找到解决方案:
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"PST"];
[calendar setTimeZone:zone];
NSDateComponents *comp = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];
date = [calendar dateFromComponents:comp];
[calendar release];
这导致日期本地化为太平洋时间。我知道这导致了不同语言环境的问题,但我的应用程序是独一无二的,这是合理的。
然后我可以使用除以86400的除法来比较日期。
虽然看起来有点矫枉过正 - 很多额外的工作 - 也许有一个更短的方式来获得特定时区的约会?
答案 0 :(得分:4)
您还可以将两个NSDate对象转换为GMT。像这样:
NSDate *date;
NSTimeZone *timeZone;
NSDate *gmtDate = [date dateByAddingTimeInterval:-[timeZone secondsFromGMTForDate:date]];
然后将NSCalendar的时区设置为GMT。像这样:
NSCalendar *calendar;
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0];
然后,您可以使用日历和GMT日期来计算您需要知道的任何内容。
答案 1 :(得分:3)
我想你可以计算出时区之间的差异。像这样:
NSDate *date1;
NSDate *date2;
NSTimeInterval dateDifference = [date1 timeIntervalSinceDate:date2];
然后计算时区差异。像这样:
NSTimeZone *timeZone1;
NSTimeZone *timeZone2;
// Assuming date1 is in timeZone1...
NSTimeInterval timeZoneDifference = [timeZone1 secondsFromGMTForDate:date1] - [timeZone2 secondsFromGMTForDate:date2];
然后将两者相加。像这样:
NSTimeInterval difference = dateDifference + timeZoneDifference;
答案 2 :(得分:2)
您应该创建两个NSDate
个实例,代表您要比较的两个日期。为此,您可以设置NSDateComponents
个实例,并不仅设置其日/月/年/小时,还设置其时区(-[NSDateComponents setTimeZone:]
)。然后致电-[NSDateComponents date]
将其转换为NSDate
。
[date1 timeIntervalSinceDate:date2]
然后给出两个日期之间的差异(以秒为单位)。将结果除以86,400以得到天数。
或者,您可以直接与[NSCalendar components:fromDate:toDate:options:]
个实例联系NSDateComponent
,以获得NSDateComponents
两者之间的差异。