【问题标题】:Convert ISO8601 String to NSDate with correct timezone使用正确的时区将 ISO8601 字符串转换为 NSDate
【发布时间】:2013-05-11 07:02:58
【问题描述】:

当我从服务器获取博客文章时,服务器会通过 JSON 将以下时间发送到我的 iOS 应用程序

"createdAt": "2013-05-11 05:54:07.589698"

但是,当它在 PostsViewController 中输出到屏幕时,它会显示 5:54 AM(比当地时间提前 4 小时)

但是当我创建一个帖子时,PostsViewController 会说一个时间像凌晨 1:54(正确)

所以我进行了调查,并检查了 SQLite,并将 2001 格式的某个日期之后的时间秒数转换为 GMT 模式。而且来自服务器的帖子实际上比应有的提前 4 小时。

基本上,并非所有 NSDate 在 Core Data 中都设置为 GMT,来自服务器的帖子出于某种原因都设置为 GMT+4。

请注意,目前我比格林威治标准时间晚 4 小时。

我所有的服务器时间都可以采用一种时间格式(格林威治标准时间)

我目前使用 Peter Hosey 的 ISO8601DateFormatter https://github.com/boredzo/iso-8601-date-formatter:

post.createdDate = [formatter dateFromString:[post_info objectForKey:@"createdAt"]];

那么,如何停止这种时差的双重偏移?

【问题讨论】:

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


    【解决方案1】:

    如果您知道您的时间是 GMT,您只需将 timeZone 设置为 dateFormatter

    NSString *dateString = @"2013-05-11 05:54:07.589698";
    
    NSDateFormatter *dateFormatter = [NSDateFormatter new];
    NSLocale *locale = [[NSLocale alloc]initWithLocaleIdentifier:@"en_US_POSIX"];
    [dateFormatter setLocale:locale];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSS"];
    
    NSDate *date = [dateFormatter dateFromString:dateString];
    
    //Time zone changed to your local  
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
    //Set a new dateFormat if you want 
    
    NSLog(@"%@",[dateFormatter stringFromDate:date]);
    

    【讨论】:

      【解决方案2】:

      你需要告诉格式化日期它应该使用哪个时区,否则它将使用设备的时区。

      【讨论】:

        【解决方案3】:

        感谢您的建议,因为我使用的是自定义日期格式化程序,这些建议使我走上了正确的道路(并且想法是正确的),但是这个库的实现略有不同。

        我刚刚在字符串的末尾添加了一个“Z”,这很有效。 Z 表示它在 UTC 时区。

        我只是想添加这个答案,以防万一其他人有同样的问题,并且正在使用 ISO8601DateFormatter 库。

        【讨论】:

          猜你喜欢
          • 2012-07-16
          • 1970-01-01
          • 1970-01-01
          • 2021-11-10
          • 2011-01-19
          • 2011-06-27
          相关资源
          最近更新 更多