我从数据库中获得了一个 unix 时间戳,并试图从中创建一个人类可读的日期。我正在使用这种方式
long t1=[time longLongValue];
NSDate* date=[NSDate dateWithTimeIntervalSince1970:t1];
其中时间是时间戳。当我打印日期时,我得到
1956-02-18 19:04:01 +0000
代替
2013-01-02 12:31:03 +0000
时间戳是1356765933449
我从数据库中获得了一个 unix 时间戳,并试图从中创建一个人类可读的日期。我正在使用这种方式
long t1=[time longLongValue];
NSDate* date=[NSDate dateWithTimeIntervalSince1970:t1];
其中时间是时间戳。当我打印日期时,我得到
1956-02-18 19:04:01 +0000
代替
2013-01-02 12:31:03 +0000
时间戳是1356765933449
正如鲍里斯在他的回答中正确指出的那样,这是整数溢出的问题。
我不知道你的time
对象是什么,但不是signed long int
使用 a NSTimeInterval
。
在 iOSNSTimeInterval
上目前定义为
typedef double NSTimeInterval;
但你不应该太在意这一点。坚持使用类型同义词将保护您,以防 Apple 决定将基础定义更改为其他内容。
也就是说,您应该将代码更改为类似
NSTimeInterval epoch = [time doubleValue];
NSDate * date = [NSDate dateWithTimeIntervalSince1970:epoch];
关于我之前描述的代码可维护性问题,这里您明确使用 a doubleValue
(您没有太多选择),但好在如果 Apple 将NSTimeInterval
定义更改为与赋值不兼容的内容double
,编译器会通知您.
试试这个
- (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;
}
Unix 时间戳只有 32 位可用。
因为他们使用有符号整数,所以他们从 1.1.1970 开始计算秒数。32 位带符号的 int 最多只能保存 2147483647 的值,如您所愿1356765933449
。这会导致溢出,并导致您的日期无效。
这也称为Year 2038 Problem
,因为 2147483647(最大值)将在 2038 年 1 月 19 日星期二 03:14:07 UTC 达到。
然后使用 nsdateformatter 格式化日期。详细指南。