如何将unix时间戳转换为人类可读时间?

zzz*_*zzz 6 iphone xcode objective-c nsdate ios

我从数据库中获取了一个unix时间戳,我正在尝试从中创建一个人类可读的日期.我正在用这种方式

long t1=[time longLongValue];

NSDate* date=[NSDate dateWithTimeIntervalSince1970:t1];
Run Code Online (Sandbox Code Playgroud)

其中时间是时间戳.当我打印日期时,我得到了

1956-02-18 19:04:01 +0000 
Run Code Online (Sandbox Code Playgroud)

代替

2013-01-02 12:31:03 +0000
Run Code Online (Sandbox Code Playgroud)

时间戳是 1356765933449

Gab*_*lla 7

这是一个整数溢出的问题,正如鲍里斯在他的回答中正确指出的那样.

我不知道你的time对象是什么,而不是signed long int使用a NSTimeInterval.

在iOS NSTimeInterval上目前定义为

typedef double NSTimeInterval;
Run Code Online (Sandbox Code Playgroud)

但是你不应该太在意这件事.如果Apple决定将基础定义更改为其他内容,那么坚持使用类型同义词将保护您.

那说你应该改变你的代码

NSTimeInterval epoch = [time doubleValue];
NSDate * date = [NSDate dateWithTimeIntervalSince1970:epoch];
Run Code Online (Sandbox Code Playgroud)

关于我之前描述的代码可维护性问题,这里你明确使用了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;

}
Run Code Online (Sandbox Code Playgroud)


Bor*_*ska 6

Unix时间戳只有32位可用.

因为它们使用signed int,所以它们计算从1.1.1970开始的秒数.32位signed int只能保存最多2147483647的值,如您所愿1356765933449.这会导致溢出,导致您的日期无效.

这也被称为Year 2038 Problem,因为2147483647(最大值)将于2038年1月19日星期二03:14:07 UTC发布.