9

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

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

4

3 回答 3

22

假设你从一个向量开始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
于 2012-09-30T17:28:38.580 回答
1

我尝试了上面的代码,但结果是错误的。我意识到主要错误与 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;
于 2014-05-28T12:31:11.190 回答
0

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
于 2014-09-25T16:45:51.160 回答