2011-08-02 64 views
0

我有以下代碼:關於產品NSDateFormatter和NSCalendar(包括時區)

self.formatter = [[NSDateFormatter alloc] init]; 
    [formatter setTimeZone:timeZone]; 
    [formatter setDateFormat:@"YYYY-MM-dd hh:mm:ss a z"]; 
    timeStampForCity = [formatter stringFromDate:[NSDate date]]; 
    NSLog(@"%@", timeStampForCity); 
    updateDate = [formatter dateFromString:timeStampForCity]; 
    NSLog(@"%@", updateDate); 

NSLog(@"%@", timeStampForCity);輸出:

2011-08-01 10:05:50 PM EDT 

NSLog(@"%@", updateDate);輸出:

2011-08-02 02:05:50 +0000 

我需要updateDate到顯示當前時區中的時間(例如,如在第一個NSLog()輸出中所見)。我如何正確地做到這一點?

編輯1

我也有這樣的代碼:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit| NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit; 
    NSDateComponents *dateComponents = [gregorian components:unitFlags fromDate:[NSDate date]]; 
    [dateComponents setTimeZone:[NSTimeZone timeZoneWithName:cityNameFormatted]]; 
    updateDate = [gregorian dateFromComponents:dateComponents]; 
    [gregorian release]; 

但時區顯示它是關閉的許多地區。

非常感謝您的幫助。

+0

這是什麼問題?當你轉換成一個字符串時,你得到了你指定的格式。當您轉換回日期時,自然記錄結果使用默認的日期格式:NSDate只包含日期/時間信息,而不是格式化信息。 –

+0

我需要EDT中的日期或我指定的任何其他時區。 – ArtSabintsev

回答

7

這裏我們再去...

日期是一個獨立的時間點。它存在並將永遠存在,無論人類和我們的時間測量設備是否存在。時區是幫助我們不發瘋的人的發明。陪審團仍然不清楚他們是否有效。 :P

當你談論想要在美國東部時間或任何其他時區的「日期」,你沒有掌握什麼日期。時區只是的一個方面,如何顯示時間點

所以,你有一個NSDate。這個日期是正確的日期,不管你所在的時區。那麼你如何「在當前時區顯示時間」?您使用NSDateFormatter

NSDate本質上是不可讀的。有幾種方法我們可以代表一個日期,例如從不同時間點開始的秒數(它本身是一個任意長的時間間隔)。但是,要創建一個日期人類可讀的只能通過格式化爲一個字符串來完成。所以,讓我們這樣做:

NSDate *myDate = [NSDate date]; // or whatever date you want to make human-readable 
NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
[f setDateStyle:NSDateFormatterLongStyle]; 
[f setTimeStyle:NSDateFormatterLongStyle]; 

NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames]; 
for (NSString *name in timeZoneNames) { 
    NSTimeZone *tz = [NSTimeZone timeZoneWithName:name]; 
    [f setTimeZone:tz]; 
    NSLog(@"%@", [f stringFromDate:date]); 
} 

現在,很明顯,這將是巨大的長期(我的長度超過400線)。但這裏的是輸出的採樣:

... 
August 2, 2011 1:03:38 AM GMT-03:00 
August 2, 2011 12:03:38 AM AST 
August 2, 2011 12:03:38 AM GMT-04:00 
August 1, 2011 11:03:38 PM EST 
August 2, 2011 1:03:38 AM GMT-03:00 
August 1, 2011 11:03:38 PM CDT 
August 2, 2011 12:03:38 AM AST 
August 2, 2011 1:03:38 AM GMT-03:00 
August 1, 2011 10:03:38 PM CST 
August 2, 2011 12:03:38 AM AST 
August 2, 2011 12:03:38 AM GMT-04:00 
August 1, 2011 11:03:38 PM GMT-05:00 
August 1, 2011 10:03:38 PM MDT 
August 1, 2011 10:03:38 PM MDT 
August 2, 2011 12:03:38 AM GMT-04:00 
August 1, 2011 11:03:38 PM CDT 
August 1, 2011 11:33:38 PM GMT-04:30 
August 2, 2011 1:03:38 AM GMT-03:00 
August 1, 2011 11:03:38 PM EST 
August 1, 2011 11:03:38 PM CDT 
August 1, 2011 10:03:38 PM MDT 
... 

所以,我們看到了什麼嗎? 相同日期有一大堆不同字符串表示形式!整齊!換句話說,格式化程序的時區是用來確定輸出字符串的樣子。

所以:日期本身有沒有與時區有關。如果你想要一個日期到看起來以某種方式,你必須配置格式化程序使它看起來這樣。


更新從你的評論,我覺得我得到你想要的。您希望日期組件爲某個時區格式化?換句話說,你有一個時間點,你想知道在美國東部時區(比如說)的時間/分鐘/秒?

如果是這樣的話,那麼你做的基礎上,日曆

NSDate *date = [NSDate date]; 
NSCalendar *cal = [NSCalendar currentCalendar]; 
[cal setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]]; 

NSDateComponents *components = [cal components:NSUIntegerMax fromDate:date]; 
NSLog(@"%@", components); 

這會給你:

<NSDateComponents: 0x100124240> 
Calendar: <CFCalendar 0x100133e90 [0x7fff7605cea0]>{identifier = 'gregorian'}/Time Zone: EST (GMT-05:00) offset -18000 
Era: 1 
Year: 2011 
Month: 8 
Day: 2 
Hour: 9 
Minute: 47 
Second: 21 
Week of Month: 1 
Week of Year: 31 
Year for Week of Year: 2011 
Weekday: 3 
Weekday Ordinal: 1 
Quarter: 0 
+0

對,我知道所有這一切。我想要做的是將格式化爲特定時區的NSDate傳遞給我製作的CA模擬時鐘。對於大多數城市來說,它不會輸出指定時區的時間。我的NSMutableArray中的零星元素顯示正確,但不是全部。 – ArtSabintsev

+0

@ArtSabintsev更新了答案。 –

+0

另外,我非常感謝您的廣泛答覆。我想我可能會經歷這麼長時間來看待這個問題。我會看看我是否可以找出一種方法來使用您的建議來動畫時鐘 – ArtSabintsev