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

6

我从数据库中获取了 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
阅读这个这个与日期格式化相关的内容。 - tkanzakic
4个回答

7

正如Boris在他的回答中正确指出的那样,这是整数溢出的问题。

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

在iOS中,NSTimeInterval目前被定义为

typedef double NSTimeInterval;

但你不应该过分在意这一点。坚持使用类型同义词将保护您,以防苹果公司决定将底层定义更改为其他内容。

话虽如此,您应该将代码更改为以下内容:

NSTimeInterval epoch = [time doubleValue];
NSDate * date = [NSDate dateWithTimeIntervalSince1970:epoch];

关于我之前提到的代码可维护性问题,您在此明确地使用了doubleValue(您没有太多选项),但好处是,如果苹果更改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;

}

它返回的是2038年1月19日-3:14的日期,而这些消息是今天发送的。 - zzzzz
好的,我用我的方法进行了检查。如果在给定的时间戳中使用intValue方法,它返回与你得到的相同结果,但是如果使用doubleValue方法,我得到的结果是Mar 14, 44964-2:57。看起来时间戳太大了。 - Talha
请参阅 此线程。我也尝试过相同的方法,但仍然得到了那个结果。 - Talha

6
Unix时间戳仅有32位可用。
因为它们使用带符号的整数,从1970年1月1日开始计算秒数。32位带符号整数只能保存最大值为2147483647的值,但您需要它为1356765933449。这会导致溢出,进而导致日期无效。
这也被称为“2038年问题”,因为2147483647(最大值)将于2038年1月19日星期二UTC时间03:14:07到达。

感谢您提供有关2038年问题的信息。 - Augustine

0

@NSIllusion,原帖不是很清楚,但问题在于日期错误,而不是格式问题。 - Gabriele Petronella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接