Преобразование эпохи в дату в Matlab

У меня есть массив эпох миллисекунд (массив чисел) в Matlab. Я хотел бы преобразовать их в формат даты и времени UTC, например DD-MM-YYYY HH:MM.

есть ли заранее определенный способ Matlab сделать это или мне придется написать свою собственную функцию?

3 ответов


Предположим, вы начинаете с вектором 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 ()


Я пробовал выше код, но результаты были не правы. Я понял, что основная ошибка связана с неудобным определением времени Unix (время эпохи). время Unix (время эпохи) определяется как количество секунд после 1-1-1970, 00h: 00, не количество**milli * * секунд (http://en.wikipedia.org/wiki/Unix_time). Таким образом, при таком определении время Unix должно быть разделено на 8.64е5 вместо 8.64e7.

кроме того, datenum('1970', 'yyyy') кажется, что не приводит к желаемому контрольному времени 1-1-1970, 00h: 00.

вот мой улучшенный код:

tMatlab = datenum (1970,1,1,0,0) + tUnix / 86400;

ответ Серга-это то, что я обычно использую, когда работаю в MATLAB. Сегодня я обнаружил, что хочу сделать преобразование в дата в MATLAB как говорится в заголовке-без преобразования datestring, указанного в теле вопроса - и выведите номер даты из оболочки.

вот что я выбрал для округленного числа дат:

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`

в качестве побочного упражнения я добавил десятичную часть обратно на дату в Баш - Я не в КШ, но это только арифметика и идет аналогичным образом:

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