2011-08-15 82 views
0

我試過一個實驗,因爲我需要能夠在我正在處理的應用程序中生成unix時間戳(自1970年以來)。NSDate dateWithTimeIntervalSince1970不返回GMT/UTC時間

NSLog(@"Getting timeIntervalSince1970"); 
    double theLoggedInTokenTimestampDateEpochSeconds = [[NSDate date] timeIntervalSince1970]; 

應(自1970年1月1日秒)格林尼治標準已經返回劃時代秒(自1970年)。然而,在週一在8月15日九點54分30秒2011在進行實驗時,它返回1313427270.504315

測試這與我的Mac OS終端一個簡單的Perl的一行,我得到: perl -e 'print scalar(localtime(1313427270))'返回週一八月15 09:54:30 2011 ...

這顯然不是格林威治標準時間,當我在SF灣區,我的當地時區設置爲「庫比蒂諾」。怎麼回事,我該如何解決它?我需要讓我的應用程序在通信時向服務器發送UTC時間,以便用戶在任何時間時間戳發送到一個平等有效的時區。 -

在我的應用程序的另一部分,當從服務器用戶請求數據時,它得到它UTC發送將其轉換成顯示如下:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 
    [dateFormatter setTimeZone:nil]; 
    [dateFormatter setDateFormat:@"yyyyMMdd"]; 
    NSDate *conversationDate = [NSDate dateWithTimeIntervalSince1970:[theConversationTimeStampString intValue]]; 
    NSString *conversationDateString = [dateFormatter stringFromDate:conversationDate]; 
    [dateFormatter release]; 

這精美的作品 - 顯示在用戶的時區和區域設置中更正的時間...所以我知道正在完成傳入的時間戳。那麼,我在做什麼錯誤的第一個函數(timeIntervalSince190),阻止它在GMT?

THX

+3

'1313427270.504315'是自1970年1月1日以來的秒數,格林威治標準時間,這是一個不依賴於你是哪個時區的絕對度量。它對應于格林尼治標準時間的「2011-08-15 16:54:30」和加州的「2011-08-15 09:54:30」。兩者都是*同一時刻*的不同表示。 – albertamg

回答

4

我不認爲第一個功能其實是錯誤的,儘管它可能看起來像它表面上。您從timeIntervalSince1970接收的時間間隔是而不是以GMT格式返回時間間隔。而是從現在到1970年1月1日00:00:00格林尼治標準時間之間的時間間隔返回。這看起來像是一個挑剔的問題,但它很重要:間隔值只不過是一個固定時間點以來的標量秒數。間隔本身不是格林尼治標準時間,只有其固定的參考點是。

我不知道Perl,但我做了本地時間文檔的快速搜索,它似乎需要任何時間和打印將標準日期類型轉換爲當地時間。這意味着描述固定時間點的時間間隔將在當時轉換回當地時間。當您從命令行顯示它時,您將再次獲得本地時間。所以看到絕對時間轉化爲當地時間是我期望看到的。

根據您的服務期望接收UTC時間的精確程度,您的時間間隔值很可能正常工作。你有證據證明它不是基於你的終端檢查之外的東西嗎?

+2

所以,這是我的不好。我正在使用標量(localtime(1313427270))。我應該使用標量(gmtime(1313427270))。那會給我那個時間戳的perl GMT版本。謝謝,蒂姆! – Jann