2012-09-30 45 views
7

在Matlab中,我有一個數組時間毫秒(數組數組)。我想將它們轉換爲UTC日期時間格式,例如DD-MM-YYYY HH:MM。在Matlab中將時元轉換爲日期

有沒有一個預定義的Matlab方法來做到這一點,還是我必須寫我自己的功能?

+2

您可能正在尋找'datestr'函數。 –

回答

18

假設你開始一個載體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()

+0

太棒了。有一點需要注意的是,現在一些unix時間戳在微秒(甚至是納秒)內,所以'864e5'可能需要是'864e8'或者甚至是'864e11'。 – charleslparker

1

我試過上面的代碼,但結果是錯誤的。我意識到主要錯誤與Unix時間(epoch時間)的尷尬定義有關。 Unix time (epoch time)被定義爲在1-1-1970,00h:00之後的數量,而不是**毫秒**(http://en.wikipedia.org/wiki/Unix_time)的數量。有了這個定義,Unix時間應該被8.64e5而不是8.64e7所分割。

此外,datenum('1970', 'yyyy')似乎不會導致所需的參考時間1-1-1970,00:00。

這裏是我改進的代碼:

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

SERG的答案是什麼,我正常使用的,當我在MATLAB我工作。今天,我發現自己希望在MATLAB中將日期轉換爲,如標題所示 - 沒有在問題主體中指定的日期字符串轉換 - 並從shell中輸出日期編號。

這裏是我看中的圓日數:

TODAY_MATLAB="$[719529 + $[`date +%s`/24/60/60]]" 

這其實只是在bash相當於你所期望的:719529是劃時代的datenum(1970-01-01或在MATLAB中爲datenum(1970,1,1))。我還通過摸索KSH最近似乎這個可以有這樣完成:

TODAY_EPOCH=`date +%s` 
TODAY_MATLAB=`expr $TODAY_EPOCH/24/60/60 + 719529` 

作爲一個方面的鍛鍊,我加入到日期小數部分回慶典 - 我沒有理會中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