2013-10-08 45 views
0

我正在格式化日期字符串用下面的代碼後:鬆動1小時格式化日期字符串

,這是日期字符串的格式:2013-10-08T20:30:00 + 03:00

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; 
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
[dateFormatter setDateFormat:@"EEEE"]; 


NSDateFormatter *formmatter = [[NSDateFormatter alloc] init]; 
formmatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:SSSZZZ"; 
NSString *dataString = [meetingData objectForKey:@"start"]; 
if (![dataString isKindOfClass:[NSNull class]]) { 
    NSMutableString *mutableDate = [dataString mutableCopy]; 
    [mutableDate deleteCharactersInRange:NSMakeRange(mutableDate.length - 3, 1)]; 
    NSDate *gmtDate = [formmatter dateFromString:mutableDate]; 
    NSDateFormatter *HHMM_Fromatter = [[NSDateFormatter alloc] init]; 
    [HHMM_Fromatter setDateFormat:@"HH:mm"]; 
    self.meetingTime = checkTheObject([HHMM_Fromatter stringFromDate:gmtDate]); 
    self.meetingDay = checkTheObject([dateFormatter stringFromDate:gmtDate]); 
} 

輸出是self.meetingTime:19:30 和self.meetingDay是好的,爲什麼我失去1小時?

回答

1

您的兩個日期格式化程序HHMM_FromatterdateFormatter使用不同的區域設置,因此使用不同的時區。您應該明確地將兩個格式化程序的時區設置爲同一個區域(可能爲[NSTimeZone localTimeZone])。

請注意,日期代碼的其餘部分似乎很脆弱。您不應該執行字符串計算以從字符串表示中刪除時區。

NSDate代表絕對時間點,不受時區或地區的影響。您應該將字符串解析爲一個單獨的NSDate,然後使用此日期來計算考慮時區的用戶面對的字符串表示。

+0

但我認爲+03:00(時區)是動態的,來自服務器,我該如何處理? –

+0

將兩者設置爲en_US後,找到輸出相同 –

+0

@orazran當然,您必須解析從服務器獲取的全部時間字符串,包括時區。您必須正確設置格式器才能解析時區部分。由此產生的'NSDate'將始終是通用的:在這個時間點的通用表示中,沒有語言環境信息。 –