Конвертировать 64-битное число окон во время Java - PullRequest
8 голосов
/ 05 марта 2011

Если бы я хотел преобразовать 64-битное число, которое представляет время в Windows, используя Java, как бы я это сделал?

Номер 129407978957060010

Я просто очень озадачен тем, как заставить это работать. Математика никогда не была моей вещью:)

Большое спасибо

Ответы [ 5 ]

15 голосов
/ 05 марта 2011

Это время, вероятно, представляет 100 наносекундных единиц с 1 января. 1601 . Между 1601 и 1970 гг. 116444736000000000 100 нс.

Date date = new Date((129407978957060010-116444736000000000)/10000);
2 голосов
/ 05 марта 2011

Предполагая, что 64-битное значение является значением FILETIME, оно представляет число интервалов в 100 наносекунд с 1 января 1601 года. Класс Java Date хранит количество миллисекунд с января 1, 1970. Чтобы преобразовать первое в второе, вы можете сделать это:

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);
1 голос
/ 05 марта 2011

Java использует Unix Timestamp .Вы можете использовать онлайн-конвертер , чтобы увидеть ваше местное время.

Чтобы использовать его в Java:

Date date = new Date(timestamp);

Обновление:

Похоже, что в Windows они имеют различное смещение времени .Таким образом, на компьютере с Windows вы будете использовать этот расчет для преобразования в метку времени 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 голосов
/ 01 марта 2016

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
0 голосов
/ 05 марта 2011

Я предполагаю, что время длинное число.

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

setTime добавляет все миллисекунды, которые long представляет с 1 января 1970 года.

...