2016-05-18 149 views
0

我有一个在不同国家使用的应用程序。在我的应用程序中,我正在执行一个简单的计算,说明当前时间是否晚于下午3点,做点什么。objective-c创建和比较时间 - 从不同国家运行

这就是我如何创建下午3点。

 NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
    NSDateComponents *dateAttempt = [[NSDateComponents alloc] init]; 
    [dateAttempt setYear:2016]; 
    [dateAttempt setMonth:05]; 
    [dateAttempt setDay:18]; 
    [dateAttempt setHour:15]; 
    [dateAttempt setMinute:00]; 
    NSDate *threePm = [calendar dateFromComponents:dateAttempt]; 
    NSLog(@"%@", dateAttempt); 
    NSLog(@"%@", threePm); 

我在纽约创建应用程序。当我运行上面的代码,我得到... 2016-05-18 11:17:53.815 x [1312:37272] 2016-05-18 19:00:00 +0000

我想这是有道理的,因为纽约比UTC落后4个小时。 (现在是我写这篇文章的时候上午11点)

所以threePm在纽约给我的UTC相当于下午3点,它的工作和预期的一样。问题是当我在笔记本电脑模拟器上更改时间来模拟在另一个国家时。例如希腊。
如果我将PC上的时间切换到希腊,由于UTC的时间调整不同,上面的代码给出了不同的结果。

我该怎么说......无论世界上哪个地方的应用程序正在运行,如果时间晚于下午3点(东部标准时间)...做些什么?

+1

尝试'currentCalendar','autoupdatingCurrentCalendar'或设置calendar'的''timeZone'。 – Willeke

+0

添加时区工作...谢谢! – solarissf

回答

1

NSDate存储绝对时间 - 实际上是UTC时间内固定点的时间偏移量。

NSDateComponents有一个timeZone属性,用作转换为NSDate的基础,这将默认为当前时区 - 如您的结果所示。

如果你总是想在纽约下午3点设置此属性。纽约是标准时区之一:America/New_York;所以你可以使用设置该属性:

dateAttempt.timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"]; 

NSTimeZone了解夏令时和依赖你设定的转换将翻译从EST或EDT适当的日期。

HTH