如何在Matlab中使用Unix时间戳?

17

我有一些包含Unix时间戳的数据文件(在这种情况下,是自1970年1月1日00:00 UTC以来的毫秒数)。我想在Matlab中将它们转换为易于阅读的日期/时间字符串(例如31-Aug-2012 11:36:24)。在Matlab中是否有简单的方法可以做到这一点,或者我最好使用外部库(例如java.text.SimpleDateFormat)?

2个回答

34

如何处理呢?

date = datestr(unix_time/86400 + datenum(1970,1,1))
如果给定的unix_time是以秒为单位,那么unix_time/86400将给出自1970年1月1日以来的天数。再加上Matlab的datenum使用的偏移量(datenum(0000,1,1) == 1),就可以得到自0000年1月1日以来的天数。这可以轻松地通过Matlab的datestr转换为人类可读的形式。
如果有毫秒,只需要使用
date = datestr(unix_time/86400/1000 + datenum(1970,1,1))

包装在函数中,它们将是:

function dn = unixtime_to_datenum( unix_time )
    dn = unix_time/86400 + 719529;         %# == datenum(1970,1,1)
end

function dn = unixtime_in_ms_to_datenum( unix_time_ms )
    dn = unix_time_ms/86400000 + 719529;   %# == datenum(1970,1,1)
end

datestr( unixtime_to_datenum( unix_time ) )

3
然而,这并不能处理闰秒。点击此处获取更多信息:http://en.wikipedia.org/wiki/Unix_time。 - Rody Oldenhuis
2
我知道Unix时间戳不包括闰秒。你是在暗示Matlab的日期/时间函数包括闰秒吗?那么我必须想办法解决这个差异? - robguinness
1
据我所知,无论是Unix时间还是Matlab的日期/时间函数都无法正确处理闰秒。我将其放在评论中,因为对于许多人来说,这个答案已经足够了。但是,如果你需要考虑闰秒,你就必须围绕它设计一些东西。 - Rody Oldenhuis
1
好的,谢谢。我宁愿在计算中忽略闰秒。只要我能够将Unix时间戳转换为友好的日期/时间,即使与挂钟时间相差几秒钟,我也不介意。我只是想确认在Matlab中转换是否与其他常用Unix纪元系统中的转换相同。 - robguinness
7
应该制定IEEE标准时间系统,并在每种编程语言中提供相应的库,因为每个新系统似乎都使用自己的临时标准。Unix时间在许多方面都很愚蠢;它唯一的优点是普及性 :) - Rody Oldenhuis
1
一个小的 MATLAB 代码片段,用于展示 MATLAB 缺乏闰秒:(datenum('1999-01-01 00:00:00')-datenum('1998-12-31 23:59:59'))*86400 应该返回 2,但实际上返回了 1 - quazgar

31

较新版本的MATLAB(在R2015a中进行了验证)具有日期时间类型,可用于处理和格式化日期和时间。您可以使用以下方法将UNIX时间戳转换为MATLAB日期时间:

dt = datetime( unix_time, 'ConvertFrom', 'posixtime' );

然后像以前一样使用datestr将其格式化为字符串

datestr( dt )

1
我认为在最新版本的Matlab中,这是最好的答案。 - Léo Léopold Hertz 준영
但不适用于2013b版本。 - wmli
我正在使用Matlab2016a。我有一个变量unix_time = 1.439078416907000e + 12,它是自1970-01-01 00:00:00.0 UTC以来的毫秒数。当我运行cmd datestr(unix_time / 86400 / 1000 + datenum(1970,1,1))时,它会给出正确的答案,即09-Aug-2015 00:00:16。但是,如果我运行cmddt = datetime(unix_time,'ConvertFrom','posixtime')datestr(dt),我得到的值是31-Jul-47572 04:41:47。我做错了什么? - sreeraj t

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