2012-09-30 6 views
7

Ho una matrice di Epoch millisecondi (matrice di numeri) in Matlab. Vorrei convertirli in formato data-ora UTC, come GG-MM-AAAA HH: MM.Conversione di epoca in data in Matlab

Esiste un modo Matlab predefinito per eseguire questa operazione o devo scrivere la mia funzione?

+2

Probabilmente stai cercando la funzione 'datestr'. –

risposta

18

Supponiamo, si inizia con un vettore time_unix, quindi:

>> 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 

Note:

1) Si veda la definizione del tempo di MATLAB.

2) 8.64e7 è il numero di millisecondi in un giorno.

3) Matlab non applica spostamenti di fuso orario, quindi il risultato è la stessa ora UTC.

4) Esempio di trasformazione all'indietro:

>> matlab_time = now; 
>> unix_time = round(8.64e7 * (matlab_time - datenum('1970', 'yyyy'))) 

unix_time = 

      1339118367664 

In sintesi, qui sono due funzioni:

function tm = unix2matlab(tu) 
    tm = datenum('1970', 'yyyy') + tu/864e5; 
end 
function tu = matlab2unix(tm) 
    tu = round(864e5 * (tm - datenum('1970', 'yyyy'))); 
end 

Il tempo MATLAB qui è numerico. Puoi sempre convertirlo in stringa usando datestr()

+0

Fantastico.Un piccolo avvertimento che alcuni timestamp unix sono in micro- (o anche nano-) secondi ora, quindi '864e5' potrebbe essere necessario' 864e8' o anche '864e11'. – charleslparker

1

Ho provato il codice sopra, ma i risultati erano sbagliati. Mi sono reso conto che l'errore principale è legato alla scomoda definizione del tempo Unix (epoca epoch). Unix time (epoch time) è definito come il numero di secondi dopo 1-1-1970, 00h: 00, non il numero di ** milli ** secondi (http://en.wikipedia.org/wiki/Unix_time). Con questa definizione, il tempo Unix dovrebbe quindi essere diviso per 8.64e5 anziché 8.64e7.

Inoltre, datenum('1970', 'yyyy') non sembra comportare il tempo di riferimento desiderato di 1-1-1970, 00h: 00.

Ecco il mio codice migliore: risposta

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

del Serg è quello che uso normalmente, quando sto lavorando in MATLAB. Oggi mi sono ritrovato a voler convertire la data in MATLAB come dice il titolo - senza la conversione del datestring specificata nel corpo della domanda - e in uscita il numero della data dalla shell.

Ecco quello che ho optato per il numero Data arrotondato:

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

questo è davvero solo la bash equivalente di ciò che ci si aspetta: 719.529 è il datenum dell'epoca (1970-01-01 o datenum(1970,1,1) in MATLAB). Sto anche armeggiando attraverso ksh ultimamente e sembra questo può essere fatto lì con:

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

Come un esercizio di lato, ho aggiunto la parte decimale indietro sulla data bash - non mi sono preoccupato in ksh, ma è solo aritmetico e va allo stesso modo:

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