0

当我从服务器获取博客文章时,服务器通过 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"]];

那么,如何停止这种时差的双重抵消呢?

4

3 回答 3

2

如果您知道您的时间是 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]);
于 2013-05-11T07:29:33.957 回答
1

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

于 2013-05-11T07:08:57.243 回答
0

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

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

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

于 2013-05-11T16:41:58.120 回答