【问题标题】:how to avoid system modify time stam, NSDate, objective c如何避免系统修改时间戳,NSDate,目标c
【发布时间】:2013-07-09 02:17:47
【问题描述】:

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

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

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

【问题讨论】:

  • 这是时区不同。

标签: iphone ios objective-c nsdate nstimezone


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    要解决此问题,请更改:

    NSTimeZone *destinationTimeZone = [NSTimeZone systemTimeZone];
    

    NSTimeZone *destinationTimeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    

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

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

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

    【讨论】:

    • 超接近语法。只需删除 timeZoneForSeconds... 前面的 i 并删除括号,因此:[NSTimeZone timeZoneForSecondsFromGMT:0]
    • @Firo 感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2023-03-19
    • 2019-04-15
    • 2011-10-30
    相关资源
    最近更新 更多