10
votes

Convertir le numéro de Windows 64 bits en Java

Si je voulais convertir un nombre de 64 bits qui se reproduit dans Windows à l'aide de Java Comment ferais-je cela?

Le nombre est 129407978957060010

Je suis juste très confus quant à la façon dont je voudrais obtenir cela pour travailler. Maths n'a jamais été ma chose :)

Merci beaucoup


3 commentaires

Vous devez clarifier ce que le nombre 64 bits représente: seconde, millisecondes? Depuis quelle heure?


Découvrez ce message Stackoverflow.com/questions / 5199478 / ...


Il s'agit d'une temporisation de Windows en millisecondes depuis que Windows UTC a commencé, il ne semble pas y avoir un moyen de le convertir ?!


5 Réponses :


-1
votes

Je suppose que le moment est un nombre long.

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


6 commentaires

Cela ressemble plus à des nanosecondes, vous avez donc probablement besoin de / 1000000L


En réalité, ils sont probablement des intervalles de 100 nanosecondes, car c'est la seule valeur de temps de 64 bits couramment utilisée dans Windows - voir FileTime


C'est correct, je viens de le tester, retourne le 9 août à 11h24h20, l'année 4102745 :)


/ 1000000 donne une date du 6 mars à 12h39h38, 1974. / 1000000 donne le 3 janvier, 11h36:29, 2011. Je ne sais vraiment pas quelle date il va, nous devinons juste à l'heure actuelle. @Simon: La méthode .Settime accepte une valeur longue, alors convertissez votre temps vers une longue et la Java fonctionnera. Peter Knego's devrait fonctionner s'il s'agit d'un horodatage UNIX.


La date est censée être le 29/1/2011 18:04:55 C'est ce que je suis confus ?!


C'est ce qui est nécessaire, date Date = nouvelle date ((129407978957060010-116444736000000000) / 10000); Nos est corrigé pour moi que je '; m très avantageux pour, je suis aussi gonflé pour tout le monde aident! Merci gars et filles!



1
votes

Java utilise Unix Timeestamp . Vous pouvez utiliser un convertisseur en ligne pour voir votre heure locale.

Pour l'utiliser en Java: P > xxx pré>

update: strong> p>

Il semble que sur Windows, ils ont Différent heure offset . Donc, sur la machine Windows, vous utiliseriez ce calcul pour convertir en horodatage UNIX: P>

#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;
}


1 commentaires

Il suffit de réaliser que sous Windows, ils sont (probablement) en utilisant différents compensations d'horodatage.



2
votes

Assumer la valeur 64 bits est un FileTime Code> , il représente le nombre d'intervalles de 100 nanosecondes depuis le 1er janvier 1601. La date Java Date de la classe stocke le nombre de millisecondes depuis le 1er janvier 1970 . Pour convertir de l'ancien à ce dernier, vous pouvez le faire:

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 commentaires

17
votes

Ce temps représente probablement 100 unités nanosecondes depuis Janvier 1. 1601 . Il y a 116444736000000000 100ns entre 1601 et 1970.

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


2 commentaires

Je pense que vous pouvez l'avoir fait, c'est si simple quand vous regardez ce que vous avez fait, mais si vous voulez jouer! Je ne sais rien du système de date dans Windows. Merci beaucoup nos Nos je l'apporte vraiment! :)


Vous pouvez calculer Nombre de jours entre les années de: (369 * 365 + (369/4) * 1-3). Fondamentalement, 365 jours par an, plus une journée par quatre ans pour une année bissextile, moins par jour par siècle B / C, il n'y a pas d'année saut au cours des années 1700, 1800 ou 1900. À partir de là, les tiques de 100ns fonctionnent comme répondus ici. .



0
votes

Public statique vide Main (String comme []) {

     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


0 commentaires