2013-01-02 137 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

相关问题