簡體   English   中英

即使我在NSDateFormatter上設置了時區,為什么stringFromDate NSString仍然具有GMT時間?

[英]Why does stringFromDate NSString still have GMT time even though I set timezone on the NSDateFormatter?

實際NSDate對象( firstTime )的輸出是我想要的輸出(iOS設備的時間)。 即使我將日期格式器( df )設置為localTimeZone ,NSString對象( secondTime )仍似乎顯示GMT時間(比我的當地時間EST早4小時)。 為什么不起作用?

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone localTimeZone]];

NSDate *firstTime = [NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]];
NSLog(@"%@", firstTime);
NSString *secondTime = [df stringFromDate:firstTime];
NSLog(@"%@", secondTime);

輸出:

第一次:2014-05-07 17:41:29 +0000,第二時間:13:41:29

NSDate沒有時區。 讀五遍,直到您理解它。

這個:

[NSDate date]

返回現在的日期。 它沒有時區。 它不在格林尼治標准時間或任何其他時區。 它沒有一個。 您的代碼:

[NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]];

表示GMT以外的任何用戶現在都沒有的時間。 我將重復一遍:您的NSDate現在不再描述。 這就像坐在舊金山,看着您的手表設置在正確的當地時間,然后說12:00,然后告訴所有人“這是凌晨4點,因為我們比格林尼治標准時間晚8個小時”。

結果是:

[df stringFromDate:firstTime]

將構建一個字符串,該字符串將顯示不是現在的時間。

不要再想自己比以前在蘋果公司工作過的每個人都要聰明,請嘗試以下方法:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone localTimeZone]];

NSString *secondTime = [df stringFromDate:[NSDate date]];
NSLog(@"%@", secondTime);

這樣說:“在當地時區給我一串'now'。” 告訴我:它輸出正確的東西嗎?

應該讓NSDate捕獲真實的日期/時間,而不要嘗試進行任何時區調整,然后讓NSDateFormatter格式化字符串,以便在所需的時區中表示它。

因此,查看您的代碼:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone localTimeZone]];

很好,盡管不需要將時區設置為本地時區。 日期格式化程序默認為當前時區。

但是隨后您嘗試獲取當前時間並進行調整:

NSDate *firstTime = [NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]];
NSLog(@"%@", firstTime);

雖然我了解您為何嘗試這樣做,但這是不正確的。 請勿調整時區。 因此, firstTime分配應為:

NSDate *firstTime = [NSDate date];
NSLog(@"%@", firstTime);

因此,如果您在美國東部時間下午5:41進行此操作,則此NSLog現在將報告2014-05-07 21:41:29 +0000 ,但這是正確的(因為+0000表示它以UTC / GMT /祖魯語)。

然后,如果要在本地時區顯示該日期,則可以采用未調整的[NSDate date]並將其與格式化程序一起使用,就像在問題中所做的那樣:

NSString *secondTime = [df stringFromDate:firstTime];
NSLog(@"%@", secondTime);

然后17:41:29您的預期報告17:41:29

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM