2012-09-16 51 views
1

我從NSDateFormatter得到一些奇怪的輸出。我將GMT的日期轉換爲系統時區,即EDT。這應該是格林威治標準時間的-4小時從NSDateFormatter輸出錯誤

- (的NSDate *)parseDate:(的NSString *)inStrDate {

NSLog(@"Date To Parse %@", inStrDate); 
NSDateFormatter* dtFormatter = [[NSDateFormatter alloc] init]; 
[dtFormatter setLocale:[NSLocale systemLocale]]; 
[dtFormatter setTimeZone:[NSTimeZone systemTimeZone]]; 
[dtFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss +0000"]; 
NSDate* dateOutput = [dtFormatter dateFromString:inStrDate]; 
NSLog(@"Parsed Date %@ %@", dateOutput, [NSTimeZone systemTimeZone]); 

return dateOutput; 

}

日誌輸出:

2012年9月15日22:32:53.358日期要解析2012-09-16 02:32:53 +0000 2012-09-15 22:32:53.360解析日期2012-09-16 06:32:53 +0000美國/紐約(EDT)偏移-14400(日光)

但它返回+4小時而不是-4。因此,它應該輸出22.30美元(格林威治標準時間02.30),實際上它將於美國東部時間06.30返回。未來8小時。

任何人都可以幫助我理解,如果我在這裏的某個地方出錯了嗎?我抓我的頭,但我不明白爲什麼這似乎無法正常工作。

謝謝

回答

2

你剛剛得到了錯誤的方式dateFormatter。 當你

[dtFormatter setTimeZone:[NSTimeZone systemTimeZone]]; 

你告訴它輸入日期是您所在時區的條款。因此,它將其轉換爲GMT並輸出時間+4小時。要做到這一點的其他方式,你可以使用這個:

NSDateFormatter* df_local = [[NSDateFormatter alloc] init]; 
[df_local setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]]; 
[df_local setDateFormat:@"yyyy.MM.dd' 'HH:mm:ss zzz"]; 

NSDate* dateOutput = [dtFormatter dateFromString:dateString]; 
NSLog(@"Parsed Date in GMT %@", dateOutput); 
NSString *yourLocalDate = [df_local stringFromDate:dateOutput]; 
NSLog(@"in EDT %@",yourLocalDate); 

這將記錄

2012-09-16 05:23:53.297 TestingApplication[10109:c07] Date To Parse 2012-09-16 02:32:53 +0000 
2012-09-16 05:23:53.302 TestingApplication[10109:c07] Parsed Date in GMT 2012-09-16 02:32:53 +0000 
2012-09-16 05:23:53.304 TestingApplication[10109:c07] in EDT 2012.09.15 22:32:53 EDT 
+0

不錯,謝謝。 –

1

如果你想有一個約會,你可以跳過二級NSDateFormatter和公正的「添加」的差異最終輸出UTC時間和當地時間之間。

formatter = [[NSDateFormatter alloc] init]; 
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];   
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; 
NSDate *date = [formatter dateFromString:dateString]; // UTC date 
NSDate *date2 = [date dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMTForDate:date]]; // local date!