我在Matlab中有一个Epoch毫秒数组(数组)。我想将它们转换为UTC日期时间格式,例如DD-MM-YYYY HH:MM。
是否有预先定义的Matlab方法来执行此操作,还是必须编写自己的函数?
答案 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