2013-01-02 161 views
6

我從數據庫中得到一個unix時間戳,我試圖從它創建一個可讀的日期。我正在使用這種方式如何將unix時間戳轉換爲人類可讀時間?

long t1=[time longLongValue]; 

NSDate* date=[NSDate dateWithTimeIntervalSince1970:t1]; 

其中time是時間戳。當我打印日期,我得到

1956-02-18 19:04:01 +0000 

,而不是

2013-01-02 12:31:03 +0000 

時間戳是1356765933449

+1

閱讀[this](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html)和[this](http://stackoverflow.com/問題/ 5739598/setting-date-format-for-nsdateformatter) – tkanzakic

回答

7

它是整數溢出的問題,因爲鮑里斯正確在他的回答中指出。

我不知道你的time對象是什麼,而不是signed long int使用NSTimeInterval

在iOS NSTimeInterval目前被定義爲

typedef double NSTimeInterval; 

,但你不應該太在意這一點。如果Apple決定將底層定義更改爲其他內容,則堅持使用類型同義詞將會保護您。

這就是說,你應該改變你的代碼,類似

NSTimeInterval epoch = [time doubleValue]; 
NSDate * date = [NSDate dateWithTimeIntervalSince1970:epoch]; 

關於我之前所描述的代碼的可維護性問題,在這裏你明確地使用doubleValue(你沒有很多選擇),但好事情是,如果Apple將NSTimeInterval定義更改爲與double賦值不兼容的東西,編譯器會通知您。

6

試試這個

- (NSString *) getDateFromUnixFormat:(NSString *)unixFormat 
{ 

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:[unixFormat intValue]]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    [dateFormatter setDateFormat:@"MMM dd, yyyy-h:mm"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
    //NSDate *date = [dateFormatter dateFromString:publicationDate]; 
    NSString *dte=[dateFormatter stringFromDate:date]; 

    [dateFormatter release]; 
    return dte; 

} 
+0

它將於2038年1月19日歸還今日發送的郵件。 – zzzzz

+0

unix的時間戳是1356765933449 – zzzzz

+0

好吧我檢查了我的方法,如果我在我的方法中使用intValue給定的時間戳,它返回相同的結果,因爲你得到但id我使用doubleValue這是我得到的3月14日,44964-2 :57,它似乎timeStamp太大了 – Talha

6

Unix時間戳有可用的只有32位。

因爲它們使用帶符號的int,所以它們計算從1.1.1970開始的秒數。一個32位有符號整數只能保存最大值爲2147483647的值,因爲你想要的值是1356765933449。這會導致溢出,並導致您的日期無效。

這也被稱爲Year 2038 Problem,因爲2147483647(最大值)將在3點14分07秒UTC週二,1月19日被打到2038

+0

感謝您提供有關2038年問題的信息。 – Augustine

相關問題