11 votes

Convertir un nombre Windows 64 bits en temps Java

Si je voulais convertir un nombre 64 bits qui représente le temps dans Windows en utilisant Java, comment ferais-je ?

Le numéro est 129407978957060010

Je ne sais pas du tout comment faire pour que cela fonctionne. Les mathématiques n'ont jamais été mon truc :)

Merci beaucoup

18voto

nos Points 102226

Ce temps représente probablement des unités de 100 nanosecondes puisque 1er janvier 1601 . Il y a 116444736000000000 100ns entre 1601 et 1970.

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

3voto

casablanca Points 41814

En supposant que la valeur de 64 bits est un FILETIME représente le nombre d'intervalles de 100 nanosecondes depuis le 1er janvier 1601. La valeur Java Date stocke le nombre de millisecondes depuis le 1er janvier 1970. Pour passer de la première à la seconde, vous pouvez procéder comme suit :

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

1voto

Peter Knego Points 57985

Java utilise Horodatage Unix . Vous pouvez utiliser un convertisseur en ligne pour connaître l'heure locale.

Pour l'utiliser en Java :

Date date = new Date(timestamp);

Mise à jour :

Il semble que sous Windows, ils aient décalage horaire différent . Ainsi, sur une machine Windows, vous utiliserez ce calcul pour convertir l'heure en heure 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;
}

0voto

user989383 Points 21

Public static void main(String as[]){

     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

-1voto

JKM Points 509

Je suppose que le temps est un nombre long.

 Date temp = new Date();
 temp.setTime((129407978957060010-116444736000000000)/10000);

setTime ajoute toutes les millisecondes que le long représente depuis le 1er janvier 1970.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X