我从数据库中获取了一个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
答案 0 :(得分: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
赋值不兼容的东西,编译器会通知你。
答案 1 :(得分: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;
}
答案 2 :(得分:6)
Unix时间戳只有32位可用。
因为他们使用signed int,所以他们计算从1.1.1970开始的秒数。 32位signed int只能保存最大值为2147483647的值,您希望它在1356765933449
。这会导致溢出,导致您的日期无效。
这也称为Year 2038 Problem
,因为2147483647(最大值)将于2038年1月19日星期二03:14:07 UTC发布。
答案 3 :(得分:0)