在Matlab中将Epoch转换为Date

时间:2012-09-30 14:09:28

标签: matlab utc epoch

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

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

3 个答案:

答案 0 :(得分: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()

将其转换为字符串

更新纳秒

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 :(得分:1)

我尝试了上面的代码,但结果是错误的。我意识到主要错误与Unix时间(纪元时间)的尴尬定义有关。 Unix time (epoch time)定义为1-1-1970,00h:00之后的数量,而不是**毫秒**(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;

答案 2 :(得分:0)

当我在MATLAB工作时,Serg的答案就是我通常使用的答案。今天我发现自己想要在MATLAB 中转换 date,如标题所示 - 没有在问题体中指定的日期字符串转换 - 并从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 中的日期 - 我没有打扰ksh,但它只是算术并且类似:

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