2012-09-30 39 views
7

Tengo una matriz de Epoch milisegundos (matriz de números) en Matlab. Me gustaría convertirlos en formato de fecha y hora UTC, como DD-MM-AAAA HH: MM.Convirtiendo Epoch to Date en Matlab

¿Existe una forma de Matlab predefinida para hacer esto o tendré que escribir mi propia función?

+2

Probablemente esté buscando la función 'datestr'. –

Respuesta

18

Supongamos, se empieza con un vector time_unix, entonces:

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

Notas:

1) Véase la definición del tiempo de MATLAB.

2) 8.64e7 es el número de milisegundos en un día.

3) Matlab no aplica ningún cambio de zona horaria, por lo que el resultado es la misma hora UTC.

4) Ejemplo para la transformación hacia atrás:

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

unix_time = 

      1339118367664 

En resumen, aquí hay dos funciones:

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

El tiempo de MATLAB aquí es numérico. Siempre puede convertirlo a cadena usando fechastr()

+0

Impresionante.La pequeña advertencia de que algunas marcas de tiempo de unix están en micro (o incluso nano) segundos ahora, de modo que '864e5' puede necesitar' 864e8' o incluso '864e11'. – charleslparker

1

He intentado con el código anterior, pero los resultados fueron incorrectos. Me di cuenta de que el error principal está relacionado con la definición incómoda del tiempo de Unix (tiempo de época). Unix time (epoch time) se define como el número de segundos después del 1-1-1970, 00h: 00, no el número de ** mili ** segundos (http://en.wikipedia.org/wiki/Unix_time). Con esta definición, el tiempo de Unix debería dividirse por 8.64e5 en lugar de 8.64e7.

Además, datenum('1970', 'yyyy') no parece dar como resultado el tiempo de referencia deseado de 1-1-1970, 00h: 00.

Aquí está mi código mejorada: Respuesta

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

de Serg es lo que normalmente utilizo, cuando estoy trabajando en MATLAB. Hoy me encontré con ganas de hacer la conversión a fecha en MATLAB como dice el título, sin la conversión de fechas especificada en el cuerpo de la pregunta, y mostrar el número de fecha del shell.

Esto es lo que se establecieron en el número de fecha redondeada:

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

Esto es realmente sólo la fiesta equivalente de lo que cabría esperar: 719529 es el datenum de la época (o 1970-01-01 datenum(1970,1,1) en MATLAB). También estoy buscando a tientas a través ksh últimamente y parece que esto se puede hacer allí con:

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

Como ejercicio lado, añadí la parte decimal de nuevo en la fecha en fiesta - no me molesté en ksh, pero solo es aritmético y va de la misma manera:

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