根据特定时区计算日期

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夏令时常用方法,日期差获取当前时间

在具有正确日期的python中转换和计算日期时间对象的时区

获取指定时区的日期时间,与计算机中设置的日期时间无关

带有时区信息的日期时间模块中的python timedelta计算[重复]

PHP,Codeigniter:如何在Web应用程序中根据用户时区/位置设置日期/时间?