2011-03-04 8 views
8

Si quisiera convertir un número de 64 bits que representa el tiempo en Windows usando Java, ¿cómo haría esto?Convertir 64 bit windows number to time Java

El número es 129407978957060010

Sólo soy muy confundido en cuanto a cómo iba a conseguir que esto funcione. Matemáticas nunca fue lo mío :)

Muchas gracias

+0

Es necesario aclarar lo que el número de 64 bits representa: segundo, milisegundos? Desde que hora? – payne

+0

Echa un vistazo a esta publicación http://stackoverflow.com/questions/5199478/java-display-windows-utc-time/5199640#5199640 –

+0

Es un tiempo de Windows en milisegundos desde que se inició Windows UTC, no parece haber un forma de convertirlo ?! – Simon

Respuesta

15

que el tiempo es probablemente representando unidades de 100 nanosegundos desde Jan 1. 1601. Hay 116444736000000000 100 ns entre 1601 y 1970.

Date date = new Date((129407978957060010-116444736000000000)/10000); 
+0

Creo que lo has hecho, es muy simple cuando miras lo que has hecho, ¡así que ten cuidado! No sé nada sobre el sistema de fechas en Windows. Muchas gracias NOS ¡Realmente lo conozco! :) – Simon

+0

Puede calcular # días entre los años como: (369 * 365 + (369/4) * 1-3). Básicamente, 365 días por año, más un día por cuatro años para el año bisiesto, menos un día por siglo b/c. No hay un año bisiesto en los años 1700, 1800 o 1900. A partir de ahí, las 100ns ticks funcionan como se responde aquí . – Nils

0

supongo que el tiempo es un número largo.

Date temp = new Date(); 
temp.setTime(129407978957060010); 

setTime agrega todos los milisegundos que la larga representa desde el 1 de enero de 1970.

+0

Esto se parece más a nanosegundos, por lo que probablemente necesite '/ 1000000l' – biziclop

+0

En realidad, probablemente sean intervalos de 100 nanosegundos, ya que ese es el único valor de tiempo de 64 bits comúnmente utilizado en Windows: consulte [' FILETIME'] (http : //msdn.microsoft.com/en-us/library/ms724284%28v=vs.85%29.aspx) – casablanca

+0

Correcto, acabo de probarlo, devuelve el 9 de agosto, 11:24:20 PM, el año 4102745 :) – Sorean

1

Java utiliza Unix Timestamp. Puede usar un online converter para ver su hora local.

utilizarlo en java:

Date date = new Date(timestamp); 

Actualización:

que parezca que en Windows tienen different time offset. Así que en la máquina de Windows que tendría que utilizar este cálculo para convertir a la marca de tiempo Unix:

#include <winbase.h> 
#include <winnt.h> 
#include <time.h> 

void UnixTimeToFileTime(time_t t, LPFILETIME pft) 
{ 
    // Note that LONGLONG is a 64-bit value 
    LONGLONG ll; 

    ll = Int32x32To64(t, 10000000) + 116444736000000000; 
    pft->dwLowDateTime = (DWORD)ll; 
    pft->dwHighDateTime = ll >> 32; 
} 
+0

Acabo de darme cuenta de que en Windows están (probablemente) utilizando diferentes compensaciones de marca de tiempo. –

+0

Actualizado con un artículo de referencia y un código de Microsoft. –

2

Suponiendo que el valor de 64 bits es un valor FILETIME, que representa el número de intervalos de 100 nanosegundos desde el 1 de enero de 1601. El java Date tiendas de clase el número de milisegundos desde el 1 de enero de 1970. para convertir desde la primera a la segunda, se puede hacer esto:

long windowsTime = 129407978957060010; // or whatever time you have 

long javaTime = windowsTime/10000 // convert 100-nanosecond intervals to milliseconds 
       - 11644473600000;  // offset milliseconds from Jan 1, 1601 to Jan 1, 1970 

Date date = new Date(javaTime); 
0

public void (String como []) {

 String windowNTTimeStr = "131007981071882420"; 
    String finalDate = ""; 
    try { 
//Windows NT time is specified as the number of 100 nanosecond intervals since January 1, 1601. 
//UNIX time is specified as the number of seconds since January 1, 1970. There are 134,774 days (or 11,644,473,600 seconds) between these dates. 
//NT to Unix : Divide by 10,000,000 and subtract 11,644,473,600. 
//Unix to NT : Add 11,644,473,600 and multiply by 10,000,000 

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      Long windowsTime = Long.parseLong(windowNTTimeStr); 
      long javaTime = windowsTime/10000 - 11644473600000L; 
      Date date = new Date(javaTime); 
      Calendar c = Calendar.getInstance(); 
      c.setTime(new Date(javaTime)); 

      Calendar cCurrent = Calendar.getInstance(); 
      cCurrent.setTime(new Date()); 
      cCurrent.add(Calendar.YEAR, 100); 

      if (!(c.getTime().getYear() > cCurrent.getTime().getYear())) { 
       finalDate = sdf.format(c.getTime()); 
      } 
     } catch (Exception e) { 
      finalDate = null; 
     } 
     System.out.println(" Final Date is "+finalDate); 
} //Expected out put Final Date is 2016-02-24 20:05:07