【问题标题】:How to work with Unix timestamps in Matlab?如何在 Matlab 中使用 Unix 时间戳?
【发布时间】:2014-08-28 00:01:59
【问题描述】:

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

【问题讨论】:

    标签: matlab unix-timestamp


    【解决方案1】:

    怎么样

    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 ) )
    

    【讨论】:

    • 这不处理闰秒。 Click here 了解更多信息。
    • 我知道 Unix 时间戳不包括闰秒。您是否暗示 Matlab 的日期/时间函数确实包含闰秒?所以我必须想办法解决这种差异?
    • @robguinness AFAIK,unix 时间或 matlab 的日期/时间函数都不能正确处理闰秒。我把它放在评论中,因为对于很多人来说,答案就足够了。但是如果你需要闰秒,你就必须围绕它设计一些东西。
    • 好的,谢谢。我宁愿把闰秒排除在外。只要我可以从 unix 时间戳转换为友好的日期/时间,我不介意它是否与挂钟时间相差几秒钟。我只是想检查一下在 Matlab 中的转换是否与在其他常用 unix epoch 的系统中相同。
    • @robguinness 确实应该有一个 IEEE 标准时间系统,以及每种编程语言的库……每个新系统似乎都使用自己的 ad-hoc 标准。 Unix 时间在许多方面也是愚蠢的。它只有无处不在的优势:)
    【解决方案2】:

    较新版本的 MATLAB(已在 R2015a 中验证)具有 datetime 类型,可用于处理和格式化日期和时间。您可以使用

    将 UNIX 时间戳转换为 MATLAB 日期时间
    dt = datetime( unix_time, 'ConvertFrom', 'posixtime' );
    

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

    datestr( dt )
    

    【讨论】:

    • 我认为这是目前最新版本的 Matlab 中最好的答案。
    • 但不是在 2013b
    • 我正在使用 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。但是如果我运行 cmd dt=datetime(unix_time, 'ConvertFrom','posixtime')datestr(dt),我得到的值是 31-Jul-47572 04:41:47。我做错了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2017-03-30
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多