根据特定时区计算日期
Posted
技术标签:
【中文标题】根据特定时区计算日期【英文标题】:Calculate dates based on specific time zone 【发布时间】:2010-11-14 16:52:01 【问题描述】:使用 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 来比较日期。
虽然,这似乎有点矫枉过正 - 需要做很多额外的工作 - 也许有更短的方法来获取特定时区的日期?
【问题讨论】:
【参考方案1】:您还可以将两个 NSDate 对象都转换为 GMT。像这样:
NSDate *date;
NSTimeZone *timeZone;
NSDate *gmtDate = [date dateByAddingTimeInterval:-[timeZone secondsFromGMTForDate:date]];
然后将 NSCalendar 的时区设置为 GMT。像这样:
NSCalendar *calendar;
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0];
然后您可以使用日历和您的 GMT 日期来计算您需要知道的任何信息。
【讨论】:
为您的帮助加分。谢谢。【参考方案2】:我想你可以计算出时区之间的差异。像这样:
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;
【讨论】:
我喜欢这个答案,它会起作用......但我正在寻找一个我可以比较的对象的特定实例。例如,可以设置为适当时区的 NSDate 对象(或类似对象)。然后,一旦我已经有了时区的日期,就可以使用它来计算天数,例如 NSCalendar 和 NSDateComponents。 为您的帮助加分。谢谢。【参考方案3】:您应该创建两个NSDate
实例来代表您要比较的两个日期。为此,您可以设置NSDateComponents
实例,不仅可以设置它们的日/月/年/小时,还可以设置它们的时区 (-[NSDateComponents setTimeZone:]
)。然后调用-[NSDateComponents date]
将它们转换为NSDate
。
[date1 timeIntervalSinceDate:date2]
然后给出两个日期之间的差异(以秒为单位)。将结果除以 86,400 得到天数。
或者,您可以使用NSDateComponent
实例直接调用[NSCalendar components:fromDate:toDate:options:]
以获取NSDateComponents
以及两者之间的差异。
【讨论】:
NSDateComponents 的问题是它需要输入日/月/年/等来设置它。如果我通过 NSDate 来创建它,它会使用 GMT。如果我可以在特定时区获得一个具有当前实际时间的 NSDate 对象,那就可以了。但是当我用 [NSDate date] 实例化时,它只会解析为 GMT。以上是关于根据特定时区计算日期的主要内容,如果未能解决你的问题,请参考以下文章
使用 Joda-Time 获取给定日期和时区的 UTC 偏移量
Calendar日期类详解SimpleDateFormat时区Date夏令时常用方法,日期差获取当前时间