secondsFromGMT在设备和模拟器上返回不同的值

时间:2015-07-10 06:53:47

标签: ios objective-c cocoa-touch timezone nsdate

我正在开发一个时间应用程序,显示不同时区的时间。为此,我使用标准时间haDate(UTC tz)。

对于displayDate我正在使用系统时区api。时区为America/Santiago(UTC-3:00)。

NSTimeZone *tz=[NSTimeZone timeZoneWithName:_timeZone];
_displayDate=[_haDate dateByAddingTimeInterval:tz.secondsFromGMT];

“haDate”代码 -

NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
formatter.timeZone=[NSTimeZone timeZoneWithName:@"UTC"];
NSString *utcTimeCurrent=[dict objectForKey:@"utctime"];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
_haDate=[formatter dateFromString:utcTimeCurrent];

问题是当我在模拟器tz.secondsFromGMT上运行此代码时返回-10800但在设备上它会返回-14400,这会减少1小时。

设备和模拟器使用相同的timeZone Asia/Kolkata(UTC + 5:30)。我知道America/Santiago使用DST,但为什么它给了我不同的秒数,即使两者(模拟器和设备)都在同一时区。

有什么问题,我该如何解决?

要解决DST问题,我正在使用此代码。但它总是转到两个设备上的else部分。 (由于tz.secondsFromGMT总是在DST调整后返回秒数,因此不需要BTW代码。)

NSTimeZone *tz=[NSTimeZone timeZoneWithName:_timeZone];
if (tz.isDaylightSavingTime)
{
    _displayDate=[_haDate dateByAddingTimeInterval:tz.secondsFromGMT+tz.daylightSavingTimeOffset];
}
else
{
    _displayDate=[_haDate dateByAddingTimeInterval:tz.secondsFromGMT];
}

当我记录tz -

在模拟器上

tz America/Santiago (GMT-3) offset -10800

在设备上

tz America/Santiago (GMT-4) offset -14400

所以它没有使用DST。

注2

此问题仅发生在iPad 2中。其他设备工作正常。

注3

我的iPad 2使用iOS 8.4。两个时区(智利标准时间 - America/Santiago和复活节岛标准时间 - Pacific/Easter)都给了我错误的秒数

1 个答案:

答案 0 :(得分:0)

智利在2015年初改变了TZ。可能你的iPad 2有一个使用过时时区数据库的iOS版本。更新它。

  

智利的时间分为两个时区。智利大陆使用时间偏移UTC-03:00。此外,复活节岛使用时间偏移UTC-05:00。[1]

     

直到2015年,智利大陆使用时间偏移UTC-04:00和复活节岛使用UTC-06:00作为标准时间,夏令时大致在每年10月至3月之间。然而,在2015年1月,宣布所有国家将保持夏令时使用的时间偏移。

https://en.wikipedia.org/wiki/Time_in_Chile