【问题标题】:Converting Epoch to Date in Matlab在 Matlab 中将时代转换为日期
【发布时间】:2012-09-21 15:05:04
【问题描述】:

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

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

【问题讨论】:

  • 您可能正在寻找datestr 函数。

标签: matlab utc epoch


【解决方案1】:

假设,你从一个向量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 时间戳现在以微秒(甚至纳秒)为单位,因此 864e5 可能需要为 864e8 甚至 864e11
  • 我收到以下错误“使用 datevecmx 时出错 datevecmx 函数只接受双精度数组。”
  • >> ... micro or nano...,好吧,相应地划分吧
  • 应用双精度()。默认情况下,matlab 中的所有数字都是双精度数,所以time_unix = 1339116554872; 也是双精度数
【解决方案2】:

我尝试了上面的代码,但结果是错误的。我意识到主要错误与 Unix 时间(纪元时间)的尴尬定义有关。 Unix time (epoch time) 定义为 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;

【讨论】:

  • 8.64e7 是一天中的毫秒数。如果您的时间戳以秒为单位,则应使用 8.64e4(即 86400),而不是 8.64e5
【解决方案3】:

Serg 的答案是我在 MATLAB 中工作时通常使用的答案。今天,我发现自己想要在 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

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 2015-09-07
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2010-12-28
    相关资源
    最近更新 更多