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

Bli*_*nja 9 timezone cocoa-touch objective-c nsdate ios

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

因为displayDate我正在使用系统时区api.时区是America/Santiago(UTC-3:00).

NSTimeZone *tz=[NSTimeZone timeZoneWithName:_timeZone];
_displayDate=[_haDate dateByAddingTimeInterval:tz.secondsFromGMT];
Run Code Online (Sandbox Code Playgroud)

"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];
Run Code Online (Sandbox Code Playgroud)

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

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

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

注意

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

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

当我记录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)给我错误的秒数

Ami*_*wad 0

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

\n
\n

智利的时间分为两个时区。智利大陆使用时间偏移 UTC\xe2\x88\x9203:00。此外,复活节岛使用时间偏移 UTC\xe2\x88\x9205:00。[1]

\n

直到 2015 年,智利大陆使用时间偏移 UTC\xe2\x88\x9204:00,复活节岛使用 UTC\xe2\x88\x9206:00 作为标准时间,夏令时大约在每年的 10 月到 3 月之间。然而,2015年1月宣布全国将保留夏令时期间使用的时间偏移。

\n
\n

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

\n