首页 文章

在Matlab中将Epoch转换为Date

提问于
浏览
9

我在Matlab中有一个Epoch毫秒数组(数组) . 我想将它们转换为UTC日期时间格式,例如DD-MM-YYYY HH:MM .

是否有预先定义的Matlab方法来执行此操作,还是必须编写自己的函数?

3 回答

  • 21

    假设,您从向量 time_unix 开始,然后:

    >> time_unix = 1339116554872; % example time
    >> time_reference = datenum('1970', 'yyyy'); 
    >> time_matlab = time_reference + time_unix / 8.64e7;
    >> time_matlab_string = datestr(time_matlab, 'yyyymmdd HH:MM:SS.FFF')
    
        time_matlab_string =
    
        20120608 00:49:14.872
    

    笔记:

    1)查看matlab时间的定义 .

    2)8.64e7是一天中的毫秒数 .

    3)Matlab不应用任何时区移位,因此结果是相同的UTC时间 .

    4)向后转换的例子:

    >> matlab_time = now;
    >> unix_time = round(8.64e7 * (matlab_time - datenum('1970', 'yyyy')))
    
    unix_time =
    
                 1339118367664
    

    总而言之,这里有两个功能:

    function tm = unix2matlab(tu)
        tm = datenum('1970', 'yyyy') + tu / 864e5;
    end
    function tu = matlab2unix(tm)
        tu = round(864e5 * (tm - datenum('1970', 'yyyy')));
    end
    

    这里的matlab时间是数字 . 您始终可以使用datestr()将其转换为字符串

    Update 为纳秒

    time_unix_nanos = 1339116554872666666;
    millis = round(time_unix_nanos / 1e6);
    nanos = time_unix_nanos - 1e6 * millis;
    time_matlab = unix2matlab(millis);
    s = [datestr(time_matlab, 'yyyymmdd HH:MM:SS.FFF'), num2str(nanos)];
    
            s =
            20120608 00:49:14.872666666
    
  • 1

    我尝试了上面的代码,但结果是错误的 . 我意识到主要错误与Unix时间(纪元时间)的尴尬定义有关 . Unix time (epoch time)定义为1-1-1970,00h:00之后 seconds 的数量,而不是毫秒http://en.wikipedia.org/wiki/Unix_time)的数量 . 根据这个定义,Unix时间应该除以8.64e5而不是8.64e7 .

    此外, datenum('1970', 'yyyy') 似乎没有产生1-1-1970,00h:00的所需参考时间 .

    这是我改进的代码:

    tMatlab = datenum (1970,1,1,0,0) + tUnix / 86400;
    
  • 0

    Serg 's answer is what I normally use, when I' m在MATLAB中工作 . 今天我发现自己想要在MATLAB中进行日期转换,如 Headers 所示 - 没有在问题体中指定的日期字符串转换 - 并从shell输出日期编号 .

    以下是我为圆形日期编号确定的内容:

    TODAY_MATLAB="$[719529 + $[`date +%s` / 24/60/60]]"
    

    这实际上只是你所期望的bash等价物:719529是时代的日期(1970-01-01或MATLAB中的 datenum(1970,1,1) ) . 我最近也在摸索ksh,似乎可以通过以下方式完成:

    TODAY_EPOCH=`date +%s`
    TODAY_MATLAB=`expr $TODAY_EPOCH / 24 / 60 / 60 + 719529`
    

    作为一个侧面练习,我将小数部分添加回bash中的日期 - 我没有't bother in ksh, but it'只有算术并且类似地:

    N_DIGITS=7
    FORMAT=$(printf "%%d.%%0%dd" $N_DIGITS)
    
    NOW_EP_SEC=`date +%s` 
    SEC_PER_DAY=$(( 24*60*60 )) 
    NOW_EP_DAY=$(( $NOW_EP /$SEC_PER_DAY ))  
    SEC_TODAY=$(( $NOW_EP_SEC - $NOW_EP_DAY*$SEC_PER_DAY )) 
    
    TODAY_MATLAB="$(( NOW_EP_DAY+719529 ))"
    FRACTION_MATLAB="$( printf '%07d' $(( ($SEC_TODAY*10**$N_DIGITS)/SEC_PER_DAY )) )"
    MATLAB_DATENUM=$( printf $FORMAT $TODAY_MATLAB $FRACTION_MATLAB )
    
    echo $MATLAB_DATENUM
    

相关问题