0

下面是某个服务器返回的时间戳字符串

dateFromServer = 2013-07-08 16:45:03Z

我正在执行以下操作将其转换为 NSDate

     NSDateFormatter *format         =   [[NSDateFormatter alloc] init];
                        [format setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss'Z'"];


    NSTimeZone *destinationTimeZone = [NSTimeZone systemTimeZone];
    [format setTimeZone:destinationTimeZone];

   dateFromServer                  =   [dateFromServer stringByReplacingOccurrencesOfString:@"T" withString:@" "];

   NSDate      *oldTime            =   [format dateFromString:dateFromServer];

我得到

oldTime is 2013-07-08 20:45:03 +0000

看起来 +4 已添加到原始时间戳

为什么会这样做,我该如何避免这种情况?

4

2 回答 2

3

NSDate对象不保留时区。相反,当打印日期时(我假设通过 a NSLog(@"%@", oldTime);),它将使用当前时区。如果您的系统设置为 GMT (+0000),那么它将像这样打印。

日期仍然正确,如果您强制它使用正确的时区打印,它将是正确的。

于 2013-07-09T02:32:39.563 回答
1

我个人不知道目标 C,但我知道问题的重点。我将尝试猜测语法。

当您收到2013-07-08 16:45:03ZZ 时,表示 UTC 或 GMT+/-0000。

您将其解析为本地时区或 GMT-0400。

然后,您将其重新转换为 UTC,并进行 4 小时的过度补偿。

要解决此问题,请更改:

NSTimeZone *destinationTimeZone = [NSTimeZone systemTimeZone];

NSTimeZone *destinationTimeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

老实说,我不确定您是否需要进行任何包装0才能充当 an ,NSInteger但这就是您所需要的。

您可能会间歇性地错过此错误,因为无法确定时间会退回到预期的效果。

出于好奇,有人可以评论我的代码是否至少部分正确?

于 2013-07-09T02:31:45.777 回答