2012-05-02 8 views
5

Tengo una intranet ejecutándose en un linux box, que se autentica contra Active Directory en un cuadro de Windows, usando LDAP a través de PHP.Convertir Windows Timestamp a la fecha usando PHP en Linux Box

puedo recuperar la entrada de un usuario de AD mediante LDAP y acceder a la última fecha de inicio de sesión desde el php array por ejemplo:

echo $adAccount['lastlogontimestamp'][0]; // returns something like 129802528752492619 

Si esto fuera una marca de tiempo Unix me gustaría utilizar el siguiente código PHP para convertir a una fecha de lectura humana:

date("d-m-Y H:i:s", $lastlogontimestamp); 

Sin embargo, esto no funciona. ¿Alguien sabe cómo puedo lograr esto o, de hecho, si es posible hacerlo desde una caja de Linux?

Respuesta

10

De acuerdo con this, el sello de tiempo de Windows que tiene allí es el número de 100-ns desde el 1 de enero de 1601. Por lo tanto, podría simplemente convertirlo a uni x marca de tiempo utilizando la siguiente fórmula:

tUnix = tWindow/(10*1000*1000)-11644473600; 

se divide por 10*1000*1000 para convertir en segundos desde el 1 Ene 1601 y entonces se descarta 11644473600 que es el número de segundos entre Enero de 1601 y enero 1970 (Tiempo Unix).

Así que en PHP:

date("d-m-Y H:i:s", $lastlogontimestamp/10000000-11644473600); 

EDIT: Es interesante, que tiene un desplazamiento diferente de Baba. Yo tengo la mía con Java:

Calendar date1 = Calendar.getInstance(); date1.set(1601, 1, 1); 
Calendar date2 = Calendar.getInstance(); date2.set(1970, 1, 1); 
long dt = date2.getTimeInMillis() - date1.getTimeInMillis(); 
System.out.println(String.format("%f", dt/1000.0)); // prints "11644473600.000000" 

De acuerdo con este SO: Ways to Convert Unix/Linux time to Windows time mi offset es correcta.

+3

Tengo un desplazamiento diferente con PHP: strtotime ("1601-01-01") - strtotime ("1970-01-01") = 11644470000. Esta es una hora (3600 segundos) diferente a la suya, pero como MSDN dice que para usar su valor derivado de Java usaré su respuesta. Gracias por su ayuda y gracias a Baba. – amburnside

+1

También he visto 11644477200 (como Baba usó). Eso es al menos tres valores diferentes. Por supuesto, la diferencia no es enorme y puede no importar en algunos contextos, pero es bueno saber cuál es el valor correcto para restar, independientemente de la zona horaria. Voy a ir con el valor '... 7360 ...' como [visto en MSDN] (http://msdn.microsoft.com/en-us/library/ms724228). – Synetech

+0

@Synetech Sí, todo el asunto de la fecha es un desastre sangriento. Siempre depende del sistema que estés usando. – brimborium

3

Ya que las ventanas no es en cuestión de segundos, pero en nano seconds que necesita para redondear hacia arriba dividiéndolo por 10000000 también es necesario para eliminar segundos entre 1601-01-01 and 1970-01-01 desde el inicio ventanas marca de tiempo de 1601-01-01

function convertWindowsTimestamp($wintime) { 
    return $wintime/10000000 - 11644477200; 
} 

$lastlogontimestamp = convertWindowsTimestamp("129802528752492619"); 
$date = date("d-m-Y H:i:s", $lastlogontimestamp); 
var_dump($date); 

salida

string '30-04-2012 10:47:55' (length=19) 
+0

¿Puede explicar qué hace su función, es decir, por qué dividir por 10 millones y luego restar 11644477200? – amburnside

+0

añadido exaplanation – Baba

Cuestiones relacionadas