2012-09-30 20 views
7

Ich habe ein Array von Epochen Millisekunden (Array von Zahlen) in Matlab. Ich möchte diese in UTC-Datum-Uhrzeit-Format konvertieren, wie DD-MM-YYYY HH: MM.Umwandlung von Epoch nach Datum in Matlab

Gibt es eine vordefinierte Matlab-Methode, oder muss ich meine eigene Funktion schreiben?

+2

Sie suchen wahrscheinlich nach der Funktion 'datetr'. –

Antwort

18

Angenommen, Sie beginnen mit einem Vektor time_unix, dann:

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

Hinweise:

1) Siehe die Definition der Zeit der Matlab.

2) 8.64e7 ist die Anzahl der Millisekunden an einem Tag.

3) Matlab wendet keine Zeitzonenverschiebung an, daher ist das Ergebnis dieselbe UTC-Zeit.

4) Beispiel für Rückwärtstransformation:

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

unix_time = 

      1339118367664 

Um es zusammenzufassen, hier sind zwei Funktionen:

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

Die Matlab Zeit hier ist numerisch. Sie können es immer in eine Zeichenkette konvertieren mit datestr()

+0

Ehrfürchtig.Ein kleiner Vorbehalt, dass einige Unix-Zeitstempel jetzt in Mikro- (oder sogar Nano-) Sekunden sind, so dass "864e5" möglicherweise "864e8" oder sogar "864e11" sein muss. – charleslparker

1

Ich versuchte den obigen Code, aber die Ergebnisse waren falsch. Ich erkannte, dass der Hauptfehler mit der unangenehmen Definition der Unix-Zeit (Epochenzeit) zusammenhängt. Unix time (epoch time) ist definiert als die Anzahl der Sekunden nach 1-1-1970, 00h: 00, nicht die Anzahl von ** Milli ** Sekunden (http://en.wikipedia.org/wiki/Unix_time). Mit dieser Definition sollte die Unix-Zeit daher durch 8.64e5 statt 8.64e7 geteilt werden.

Darüber hinaus scheint datenum('1970', 'yyyy') nicht die gewünschte Referenzzeit von 1-1-1970, 00h: 00 zu ergeben.

Hier ist mein verbesserter Code:

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

Serg Antwort ist, was ich normalerweise verwenden, wenn ich in MATLAB arbeiten bin. Heute wollte ich die Konvertierung zu Datum in MATLAB, wie der Titel sagt, ohne die im Fragetext angegebene Datumszeichenkonvertierung durchführen und die Datumsnummer aus der Shell ausgeben. Hier

ist, was ich auf die abgerundeten Datumszahl abgerechnet:

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

Das ist wirklich nur die bash entspricht dem, was man erwarten würde: 719.529 ist die datenum- der Epoche (1970-01-01 oder datenum(1970,1,1) in MATLAB). Ich bin auch durch KSH Gefummel in letzter Zeit und es scheint, dies es getan werden kann, mit:

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

Als Neben Übung, habe ich das Dezimalsystem Teil wieder auf das Datum in bash - Ich habe nicht die Mühe, in ksh, aber es ist nur arithmetisch und geht ähnlich:

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