【问题标题】:980 seconds lost when using NSDateFormatter to convert timezones使用 NSDateFormatter 转换时区时丢失 980 秒
【发布时间】:2011-10-27 05:30:55
【问题描述】:

在解析不同时区的日期时,我注意到 NSDateFormatter 在处理很久以前的日期时会产生奇怪的结果。

我有以下代码:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setLocale:usLocale];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];

NSString* dateString1 = @"1890-09-30 12:00";
NSString* dateString2 = @"1890-10-01 12:00";

NSLog(@"original timezone %@", [dateFormatter timeZone]);

NSDate* localDate1 = [dateFormatter dateFromString:dateString1];
NSDate* localDate2 = [dateFormatter dateFromString:dateString2];
NSLog(@"localDate1 %@ » %@", dateString1, localDate1);
NSLog(@"localDate2 %@ » %@", dateString2, localDate2);

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

NSDate* utcDate1 = [dateFormatter dateFromString:dateString1];
NSDate* utcDate2 = [dateFormatter dateFromString:dateString2];
NSLog(@"utcDate1   %@ » %@", dateString1, utcDate1);
NSLog(@"utcDate2   %@ » %@", dateString2, utcDate2);

我希望 localDates 比 UTC 时间少一小时,因为我的时区是 CET。相反,我得到了这个:

original timezone Europe/Budapest (CEST) offset 7200 (Daylight)
localDate1 1890-09-30 12:00 » 1890-09-30 10:43:40 +0000
localDate2 1890-10-01 12:00 » 1890-10-01 11:00:00 +0000
utcDate1   1890-09-30 12:00 » 1890-09-30 12:00:00 +0000
utcDate2   1890-10-01 12:00 » 1890-10-01 12:00:00 +0000

经过一番调查,该错误似乎出现在早于 1890-09-30 23:43 的日期。

这是什么原因?这是 iOS 日期处理中的错误吗?

【问题讨论】:

    标签: ios date timezone


    【解决方案1】:

    时区的奇妙世界:

    当地标准时间快到的时候 1890 年 10 月 1 日,星期一,00:00:00 时钟倒转 0:16:20 到 改为 1890 年 9 月 30 日星期日 23:43:40 当地标准时间

    http://www.timeanddate.com/worldclock/clockchange.html?n=50&year=1890

    【讨论】:

    • 人们想知道为什么处理时间的软件可能包含错误,尽管它只是“时间”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2018-07-15
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2012-05-17
    相关资源
    最近更新 更多