2013-05-11 71 views
0

服務器通過JSON發送以下時間到我的iOS應用程序,當我從服務器獲取博客文章轉換ISO8601字符串的NSDate使用正確的時區

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

然而,當,它輸出到屏幕PostsViewController ,它說,上午5時54(提前當地時間4小時)

但是當我創建了一個帖子,PostsViewController,會說像上午01時54時(正確)

所以我去調查,並我檢查了SQLite,並將時間從2001年的格式轉換爲格林威治標準時間模式。而服務器的帖子實際上比他們應該提前4小時。

基本上,並非所有的NSDate都在Core Data中設置爲GMT,出於某種原因,來自服務器的帖子被設置爲GMT + 4。

請注意,目前,我比格林威治標準時間晚了4個小時。

我所有的服務器時間均確定在一個TIMEFORMAT(GMT)

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

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

那麼怎麼樣,我停止了時間差的這種雙重抵消?

回答

0

感謝您的建議,因爲我使用的是自定義的日期格式,這些建議把我放在正確的跟蹤(和想法是正確的),但這個庫的實現稍有不同。

我剛剛在字符串末尾添加了一個'Z',並且工作正常。 Z表示它在UTC時區。

我只是想我會添加這個答案,以防其他人有這個相同的問題,並且正在使用ISO8601DateFormatter庫。

1

您需要告訴格式化的日期,它應該使用什麼時區,否則它將使用設備的時區。

+0

謝謝,這使我找到了正確的答案! – GangstaGraham 2013-05-11 16:42:17

2

如果你知道你的時間是格林尼治標準時間,你只需要時區設置爲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]); 
+0

謝謝,這使我找到了正確的答案! – GangstaGraham 2013-05-11 16:42:46