我在 Matlab 中有一个 Epoch 毫秒数组(数字数组)。我想将这些转换为 UTC 日期时间格式,例如 DD-MM-YYYY HH:MM。
是否有预定义的 Matlab 方法来执行此操作,或者我必须编写自己的函数?
假设你从一个向量开始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
我尝试了上面的代码,但结果是错误的。我意识到主要错误与 Unix 时间(纪元时间)的尴尬定义有关。Unix 时间(纪元时间)定义为 1970 年 1 月 1 日 00h:00 之后的秒数,而不是 **milli** 秒数(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;
Serg 的答案是我在 MATLAB 中工作时通常使用的答案。今天我发现自己想在 MATLAB 中转换为日期,如标题所述 - 没有在问题正文中指定日期字符串转换 - 并从 shell 输出日期编号。
这是我确定的四舍五入日期数字:
TODAY_MATLAB="$[719529 + $[`date +%s` / 24/60/60]]"
这实际上只是您所期望的 bash 等价物:719529 是时代的日期编号(1970-01-01 或datenum(1970,1,1)
在 MATLAB 中)。我最近也在摸索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