![](/img/trans.png)
[英]NSDateFormatter stringFromDate: returning local time instead of UTC / 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.