Convert 64-bit windows to Java numeric time

If I wanted to convert a 64-bit number that reproduces time in Windows using Java, how would I do it?

Number: 129407978957060010

I am just very confused as to how I can make this work. Math has never been mine :)

Many thanks

+8
java windows time bit
source share
5 answers

This time is probably 100 nanosecond units since January 1, 1601 . There are 116444736000000000 100ns between 1601 and 1970.

Date date = new Date((129407978957060010-116444736000000000)/10000); 
+15
source share

Assuming the 64-bit FILETIME value, it represents the number of 100-nanosecond intervals since January 1, 1601. The Java Date class stores the number of milliseconds since January 1, 1970. To convert from the first to the last, you can do this:

 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); 
+2
source share

Java uses Unix Timestamp . You can use the online converter to see your local time.

To use it in java:

 Date date = new Date(timestamp); 

Update:

Windows seems to have a different time offset . So, on a Windows machine, you will use this calculation to convert to a Unix timestamp:

 #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
source share

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
source share

I guess time is a long number.

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

setTime adds all the milliseconds that long represents since January 1, 1970.

-one
source share

All Articles