2013-07-26 10 views
7

करने के लिए 1904 के बाद से नैनोसेकंड परिवर्तित मैं एक नंबर: 12:00 a.m. के, 1 जनवरी, 1904, सार्वभौमिक समय के बाद से नैनोसेकंड की संख्या का प्रतिनिधित्व करते हैं। मैं उस तारीख का प्रतिनिधित्व करने वाले java.util.Date ऑब्जेक्ट को तुरंत चालू करना चाहता हूं। मुझे कैसे आगे बढ़ना चाहिए?एक वैध जावा तारीख

+1

कोई भी चीज़ बदलने की संख्या नहीं होगी? –

उत्तर

5

आपको पहले अपने संख्यानैनोसेकंड का प्रतिनिधित्व कन्वर्ट करने के लिए की जरूरतको मिलीसेकंड

फिर दिए गए दिनांक स्ट्रिंग के लिए, यूनिक्स समय युग के बाद मिलीसेकंड की कुल संख्या प्राप्त करें, और उसके बाद पहले संख्या को मिलीसेकंड में परिवर्तित करें।

String target = "1904/01/01 12:00 AM"; // Your given date string 
long nanoseconds = ...; // nanoseconds since target time that you want to convert to java.util.Date 

long millis = TimeUnit.MILLISECONDS.convert(nanoseconds, TimeUnit.NANOSECONDS); 

DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd hh:mm aaa"); 
formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date date = formatter.parse(target); 

long newTimeInmillis = date.getTime() + millis; 

Date date2 = new Date(newTimeInmillis); 

System.out.println(date2); 

एक import java.util.concurrent.TimeUnit; जोड़ें:

यहाँ काम कर कोड है।

+1

दिनांक प्रारूप यूटीसी टाइमज़ोन में होना चाहिए, और डिफ़ॉल्ट टाइमज़ोन में नहीं होना चाहिए। –

+0

@JBNizet। अरे हां! धन्यवाद संपादित :) –

+0

आप कैलेंडर सिस्टम भी भूल गए हैं, जो लोकेल निर्भर है, मेरा जवाब अधिक सटीक है। – kan

-3

सभी java.util.Date

सबसे पहले एक तिथि वस्तु का आवंटन और यह initializes इतना है कि यह समय, जिस पर यह आवंटित किया गया था, निकटतम मिलीसेकंड को मापा जाता प्रतिनिधित्व करता है।

इसलिए, यदि आप चर राशि milliseconds

  1. किसी तरह अपनी तिथि और जनवरी 1, 1970 (यूनिक्स काल) diff

  2. बीच मिलीसेकंड की संख्या का प्रयोग करें Date(long) निर्माता

    new Date(milliseconds - diff); 
    
    गणना
+8

मूल रूप से चरण 1 नहीं है "यहां, एक चमत्कार होता है"? – millimoose

+0

ने सोचा कि अगर तारीख तय की गई है, तो हम इसे "जादू" तरीके से कर सकते हैं (उदाहरण के लिए ओपी के लिए जाना जाता है) – RiaD

2

मुझे लगता है कि यह मामूली बात है:

final GregorianCalendar startDate = new GregorianCalendar(TimeZone.getTimeZone("UTC")); 
startDate.clear(); 
startDate.set(1904, Calendar.JANUARY, 1); 
final long startMillis = startDate.getTimeInMillis(); 
new Date(nanos/1000/1000 + startMillis) 
+1

@ बालससी क्या आप कृपया बता सकते हैं क्यों? – kan

+0

और Timestamp.valueOf() वर्तमान टाइमज़ोन का उपयोग करता है, न कि यूटीसी। –

+0

@ बालससी ईमानदारी से मुझे नहीं लगता कि जेडीके दिनांक/समय कार्यों का उपयोग करने का कोई तरीका है जो दुर्व्यवहार नहीं करेगा ... हमेशा जोडाटाइम का उपयोग करने के लिए शर्त लगाता है। – kan

0

दिनांक सही = new Date (नई तिथि() getTime() - (नैनोसेकंड में समय/(1000 * 1000))।);

क्या इस का उपयोग करने में गलत क्या है? मैंने 8 जून 1 9 26 के लिए "नैनोसेकंड में समय" के मूल्य के साथ परीक्षण किया और यह काम करता है। और डेट प्रारूप के साथ इसका कोई लेना-देना नहीं है, उस समय का प्रतिनिधित्व करने वाले अंतर्निहित मिलीसेकंड मूल्य आवश्यक है।

+0

आपका समाधान बस गलत है। आपका समाधान किसी भी तरह से 1 जनवरी 1 9 04 की तारीख का संदर्भ नहीं देता है, लेकिन परिणाम इस तारीख पर निर्भर करता है। अन्यथा, आपका समाधान अन्य समय प्रणालियों के लिए भी सार्वभौमिक होगा, 5 मई 1850 के बाद से नैनोसेकंड की तरह (केवल मनमाने ढंग से बनाई गई तारीख)। इसके अलावा, आपके पास "नैनोसेकंड्स में समय" के सामने एक शून्य है, जिसका प्रभाव यह है कि बाद में नैनो में समय है, इससे पहले आपकी डेट ऑब्जेक्ट का समय होगा। इसके अलावा, आपका परिणाम वर्तमान समय पर निर्भर करता है। इससे इस छोटे सूत्र में कुल 3 गलतियां होती हैं। –

संबंधित मुद्दे