2011-03-04 19 views
8

कनवर्ट करें यदि मैं 64 बिट नंबर को कनवर्ट करना चाहता हूं जो जावा का उपयोग कर विंडोज में समय को दोबारा बदलता है तो मैं यह कैसे करूं?64 बिट विंडोज़ संख्या समय में जावा

संख्या 129407978957060010

मैं बस बहुत कैसे मैं इस काम करने के लिए मिलता है के रूप में उलझन में हूँ है। गणित मेरी बात :)

बहुत धन्यवाद

+0

आप स्पष्ट करने के लिए क्या 64-बिट संख्या का प्रतिनिधित्व करता जरूरत है? किस समय से? – payne

+0

इस पोस्ट को देखें http://stackoverflow.com/questions/5199478/java-display-windows-utc-time/5199640#5199640 –

+0

यह विंडोज़ यूटीसी शुरू होने के बाद से मिलीसेकंड में विंडोज़ टाइम है, ऐसा लगता है कि ऐसा नहीं लगता है इसे बदलने के लिए रास्ता ?! – Simon

उत्तर

15

उस समय शायद Jan 1. 1601 के बाद से 100 nanosecond इकाइयों का प्रतिनिधित्व कर रहा है। दूसरा, मिलीसेकंड: वहाँ 1601 के बीच 116444736000000000 100ns और 1970.

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

मुझे लगता है कि आपने इसे किया होगा, यह बहुत आसान है जब आप देखते हैं कि आपने क्या किया है लेकिन दिमागी गड़बड़ है! मुझे विंडोज़ में डेट सिस्टम के बारे में कुछ भी पता नहीं है। बहुत बहुत धन्यवाद, मैं वास्तव में इसे appericiate करते हैं! :) – Simon

+0

आप वर्षों के बीच # दिनों की गणना कर सकते हैं: (36 9 * 365 + (36 9/4) * 1-3)। मूल रूप से, प्रति वर्ष 365 दिन, साथ ही लीप वर्ष के लिए प्रति दिन एक दिन, प्रति दिन एक शताब्दी बी/सी में 1700, 1800, या 1 9 00 के वर्षों में कोई छलांग वर्ष नहीं है। वहां से 100ns टिक्स का उत्तर यहां दिया गया है । – Nils

0

मुझे लगता है कि समय एक लंबे संख्या है कभी नहीं था।

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

setTime सभी मिलीसेकेंड कि लंबे समय से 1 जनवरी के बाद का प्रतिनिधित्व करता है, 1970

+0

यह नैनोसेकंड की तरह दिखता है, इसलिए आपको शायद '1000000l' – biziclop

+0

की आवश्यकता है, असल में, वे शायद 100-नैनोसेकंद अंतराल हैं, क्योंकि विंडोज़ में आमतौर पर उपयोग किया जाने वाला एकमात्र 64-बिट टाइम मान है - [' FILETIME'] (http देखें : //msdn.microsoft.com/en-us/library/ms724284%28v=vs.85%29.aspx) – casablanca

+0

यह सही है, मैंने अभी इसका परीक्षण किया, 9 अगस्त, 11:24:20 अपराह्न, वर्ष 4102745 :) – Sorean

1

जावा Unix Timestamp का उपयोग करता है कहते हैं। आप अपना स्थानीय समय देखने के लिए online converter का उपयोग कर सकते हैं।

जावा में इसका इस्तेमाल करने के लिए:

Date date = new Date(timestamp); 

अद्यतन:

यह प्रतीत कि विंडोज पर वे different time offset है। तो Windows मशीन पर आप यूनिक्स टाइमस्टैम्प कन्वर्ट करने के लिए इस गणना का उपयोग करेंगे:

#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

बस एहसास हुआ कि विंडोज़ पर वे (आमतौर पर) विभिन्न टाइमस्टैम्प ऑफसेट का उपयोग कर रहे हैं। –

+0

माइक्रोसॉफ्ट से एक संदर्भ आलेख और कोड के साथ अद्यतन किया गया। –

2

64-बिट मूल्य मान लिया जाये कि एक FILETIME मूल्य है, यह 1 जनवरी 1601. के बाद से 100-nanosecond अंतराल की संख्या का प्रतिनिधित्व करता है जावा 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); 
0

public static void मैं (के रूप में [] स्ट्रिंग) {

 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 
संबंधित मुद्दे