我在Matlab中有一个Epoch毫秒数组(数组) . 我想将它们转换为UTC日期时间格式,例如DD-MM-YYYY HH:MM .
是否有预先定义的Matlab方法来执行此操作,还是必须编写自己的函数?
假设,您从向量 time_unix 开始,然后:
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()将其转换为字符串
Update 为纳秒
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 time (epoch time)定义为1-1-1970,00h:00之后 seconds 的数量,而不是毫秒(http://en.wikipedia.org/wiki/Unix_time)的数量 . 根据这个定义,Unix时间应该除以8.64e5而不是8.64e7 .
此外, datenum('1970', 'yyyy') 似乎没有产生1-1-1970,00h:00的所需参考时间 .
datenum('1970', 'yyyy')
这是我改进的代码:
tMatlab = datenum (1970,1,1,0,0) + tUnix / 86400;
Serg 's answer is what I normally use, when I' m在MATLAB中工作 . 今天我发现自己想要在MATLAB中进行日期转换,如 Headers 所示 - 没有在问题体中指定的日期字符串转换 - 并从shell输出日期编号 .
以下是我为圆形日期编号确定的内容:
TODAY_MATLAB="$[719529 + $[`date +%s` / 24/60/60]]"
这实际上只是你所期望的bash等价物:719529是时代的日期(1970-01-01或MATLAB中的 datenum(1970,1,1) ) . 我最近也在摸索ksh,似乎可以通过以下方式完成:
datenum(1970,1,1)
TODAY_EPOCH=`date +%s` TODAY_MATLAB=`expr $TODAY_EPOCH / 24 / 60 / 60 + 719529`
作为一个侧面练习,我将小数部分添加回bash中的日期 - 我没有't bother in ksh, but it'只有算术并且类似地:
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
3 回答
假设,您从向量
time_unix
开始,然后:笔记:
1)查看matlab时间的定义 .
2)8.64e7是一天中的毫秒数 .
3)Matlab不应用任何时区移位,因此结果是相同的UTC时间 .
4)向后转换的例子:
总而言之,这里有两个功能:
这里的matlab时间是数字 . 您始终可以使用datestr()将其转换为字符串
Update 为纳秒
我尝试了上面的代码,但结果是错误的 . 我意识到主要错误与Unix时间(纪元时间)的尴尬定义有关 . Unix time (epoch time)定义为1-1-1970,00h:00之后 seconds 的数量,而不是毫秒(http://en.wikipedia.org/wiki/Unix_time)的数量 . 根据这个定义,Unix时间应该除以8.64e5而不是8.64e7 .
此外,
datenum('1970', 'yyyy')
似乎没有产生1-1-1970,00h:00的所需参考时间 .这是我改进的代码:
Serg 's answer is what I normally use, when I' m在MATLAB中工作 . 今天我发现自己想要在MATLAB中进行日期转换,如 Headers 所示 - 没有在问题体中指定的日期字符串转换 - 并从shell输出日期编号 .
以下是我为圆形日期编号确定的内容:
这实际上只是你所期望的bash等价物:719529是时代的日期(1970-01-01或MATLAB中的
datenum(1970,1,1)
) . 我最近也在摸索ksh,似乎可以通过以下方式完成:作为一个侧面练习,我将小数部分添加回bash中的日期 - 我没有't bother in ksh, but it'只有算术并且类似地: