我从数据库中获取了 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
。我从数据库中获取了 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
。正如Boris在他的回答中正确指出的那样,这是整数溢出的问题。
我不知道你的time
对象是什么,但是请使用NSTimeInterval
而不是signed long int
。
在iOS中,NSTimeInterval
目前被定义为
typedef double NSTimeInterval;
但你不应该过分在意这一点。坚持使用类型同义词将保护您,以防苹果公司决定将底层定义更改为其他内容。
话虽如此,您应该将代码更改为以下内容:
NSTimeInterval epoch = [time doubleValue];
NSDate * date = [NSDate dateWithTimeIntervalSince1970:epoch];
关于我之前提到的代码可维护性问题,您在此明确地使用了doubleValue
(您没有太多选项),但好处是,如果苹果更改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;
}
1356765933449
。这会导致溢出,进而导致日期无效。