2012-01-18 7 views
8

हां, जावा और जावास्क्रिप्ट में दिनांक के बारे में एक और सवाल।जावास्क्रिप्ट दिनांक और java.util.Date कन्स्ट्रक्टर तर्क

टाइमज़ोन जावा और ब्राउज़र (क्रोम) दोनों में जीएमटी +4 (मॉस्को) है।

<script language="javascript"> 
    var d = new Date(170798400000); 
    document.write(d); 
</script> 

देता है: रवि जून 01 1975 00:00:00 GMT + 0400 (रूस मानक समय)

public class Test { 
    public static void main(String[] args) { 
     java.util.Date d = new java.util.Date(170798400000L); // the same epoch value! 
     System.out.println(d); 
    } 
} 

देता है: शनि मई 31 23:00:00 एमएसके 1975

हैं मैं युग मूल्य को 2011-2012 साल की तरह बदलता हूं (रूस में डेलाइट सेविंग रद्द होने के बाद) आउटपुट ठीक है। टाइमज़ोन अद्यतनकर्ता उपकरण ठीक चला गया।

क्या यह एक बग या दस्तावेज सुविधा है? क्या YYYY-MM-dd HH: mm: एसएस या तो प्रारूपण और पुन: विश्लेषण को छोड़कर इसे संभालने का कोई तरीका है?

जावाडोक से

:

की तारीख (लंबे तारीख)

एक दिनांक वस्तु का आवंटन और यह initializes के रूप में "युग" के नाम से मानक आधार समय के बाद से मिलीसेकेंड की निर्धारित संख्या का प्रतिनिधित्व करने के, अर्थात् जनवरी 1 , 1 9 70, 00:00:00 जीएमटी।

जावास्क्रिप्ट संदर्भ से

:

नई तिथि (मिलीसेकेंड)

मिलीसेकेंड - 1 के बाद से मिलीसेकेंड की संख्या का प्रतिनिधित्व जनवरी 1970 पूर्णांक मान 00:00:00 यूटीसी (यूनिक्स काल)।

+0

शायद "टाइम ज़ोन चेंज" के साथ इसका कुछ संबंध है: http://en.wikipedia.org/wiki/Moscow_Time –

+0

यह निश्चित रूप से है। क्या इसका मतलब है कि दिनांक निर्माता का जावास्क्रिप्ट में अब उपयोग नहीं किया जा सकता है? – ike3

+0

ठीक है, अगर उनमें से कोई सही जवाब दे रहा है, लेकिन दूसरा नहीं, तो मैं कहूंगा कि दूसरे में एक बग है :-) क्या जावा सही है या जावास्क्रिप्ट है? मैं जावा संस्करण को सही उत्तर देने की अपेक्षा करता हूं, लेकिन यह सिर्फ एक संदेह है। – Pointy

उत्तर

1

क्या यह एक बग या दस्तावेज सुविधा है?

यह जावास्क्रिप्ट के साथ एक बग नहीं है। कम से कम, मुझे कोई रास्ता नहीं दिखता कि मैं इसका दावा कर सकता हूं।

ब्राउज़र का जावास्क्रिप्ट इंजन "जीएमटी + 4" में परिवर्तित समय लौटा रहा है। जो आप चाहते हैं, जाहिर है, एमएसके है जो जीएमटी + 4 से अलग है (जैसा कि आपकी टिप्पणी में उल्लेख किया गया है)। एमएसके के बारे में नहीं जानते जावास्क्रिप्ट को एक बग के रूप में नहीं गिना जाता है, लेकिन एक सुविधा की कमी है। शायद जेएस टाइमज़ोन के विस्तृत ज्ञान के लिए "गलत" है, लेकिन यह एक बग नहीं है।

क्या वाईएवाईवाई-एमएम-डीडी एचएच: एमएम: एसएस या इतने प्रारूपण और री-पार्सिंग को छोड़कर इसे संभालने का कोई तरीका है?

टाइमज़ोन के सभी मनमानी विवरणों को ट्रैक रखने के लिए बहुत सारे काम की आवश्यकता होती है। मुझे ऐसा कोई कोडबेस नहीं पता है जिसमें जावास्क्रिप्ट के लिए यह सब काम उपलब्ध है। इसलिए, मेरा मानना ​​है कि, हाँ, यदि आप सही एमएसके का उपयोग करना चाहते हैं तो आपको मैन्युअल रूप से उस रूपांतरण को कोड करना होगा।

1

समय के स्ट्रिंग का प्रतिनिधित्व (जैसे "Sun Jun 01 1975 00:00:00 GMT+0400") मानव के लिए उपयोग किया जाता है। समय मूल्य (1 जनवरी, 1 9 70 यूटीसी के बाद मिलीसेकंड) भंडारण और गणना के लिए उपयोग किया जाता है।

वहां कोई बग नहीं है। जावास्क्रिप्ट में, विनिर्देश के अनुसार, स्ट्रिंग प्रतिनिधित्व की सामग्री कार्यान्वयन-निर्भर है।जावा में, प्रलेखन के अनुसार, डेलाइट सेविंग टाइम परिलक्षित हो सकता है।

JavaScript specification से:

15.9.5.2 Date.prototype.toString ()

यह समारोह एक स्ट्रिंग मान देता है। स्ट्रिंग की सामग्री कार्यान्वयन-> निर्भर है, लेकिन एक सुविधाजनक, मानव-पठनीय रूप में वर्तमान समय क्षेत्र में दिनांक का प्रतिनिधित्व करने का इरादा है।

Java documentation से

:

java.util.Date, public String toString() 

Converts this Date object to a String of the form: dow mon dd hh:mm:ss zzz yyyy 

where: 
... 
zzz is the time zone (and may reflect daylight saving time).` 
0

tl; डॉ

Instant.ofEpochMilli(170_798_400_000L) 

1975-05-31T20: 00: 00Z

... और ...

Instant.ofEpochMilli(170_798_400_000L) 
     .atZone(ZoneId.of("Europe/Moscow")) 

1975-05-31T23: 00 + 03: 00 [यूरोप/मास्को]

देखें live code

java.time

आधुनिक दृष्टिकोण का उपयोग जावा 8 और बाद में java.time कक्षाओं का उपयोग करता है।

आप जावा में परेशान पुराने डेट-टाइम कक्षाओं का उपयोग कर रहे हैं जो अब विरासत हैं। स्ट्रिंग उत्पन्न करते समय वर्तमान डिफ़ॉल्ट समय क्षेत्र को लागू करने वाले Date::toString विधि की उन वर्गों की कई समस्याओं में से एक इरादा लेकिन भ्रमित विशेषता थी। आंतरिक मूल्य वास्तव में हमेशा यूटीसी में होता है, लेकिन toString भ्रम पैदा करता है कि Date में समय क्षेत्र होता है जब वास्तव में यह नहीं होता है। यह आपके MSK रहस्य बताता है।

[यहां तक ​​कि अधिक भ्रमित, वास्तव में Date में गहरा दफन एक समय क्षेत्र है लेकिन इस चर्चा के लिए अप्रासंगिक है। उन पुराने Date/Calendar कक्षाएं एक भयानक गड़बड़ हैं। सौभाग्य से जावा में अब किसी भी प्लेटफॉर्म पर सर्वश्रेष्ठ श्रेणी में डेट-टाइम फ्रेमवर्क है: java.time।]

स्पष्ट रूप से आपका इनपुट 1 9 70-01-01T00: 00: 00Z के यूनिक्स युग के बाद मिलीसेकंड की संख्या का प्रतिनिधित्व करता है।

Instant कक्षा UTC में nanoseconds (दशमलव अंश के नौ (9) अंकों के संकल्प के साथ समयरेखा पर एक पल का प्रतिनिधित्व करती है)। यह वर्ग सीधे आपके इनपुट नंबर का विश्लेषण कर सकता है।

Instant instant = Instant.ofEpochMilli(170_798_400_000L) ; 

instant.toString(): 1975-05-31T20: 00: 00Z

आप किसी विशेष क्षेत्र के wall-clock time के लेंस के माध्यम से है कि एक ही पल को देखने के लिए चाहते हैं, एक समय लागू क्षेत्र।ZonedDateTime ऑब्जेक्ट प्राप्त करने के लिए ZoneId लागू करें।

ZoneId z = ZoneId.of("Europe/Moscow") ; 
ZonedDateTime zdt = instant.atZone(z) ; 

1975-05-31T23: 00 + 03: 00 [यूरोप/मास्को]

JavaScript लाइब्रेरी गलत

JavaScript लाइब्रेरी है करने के लिए अपने कॉल के परिणाम है +04: 00 के ऑफसेट के साथ गलत है। According to Wikipedia, 1 9 30 से 1 9 81 तक मॉस्को का समय तीन घंटे आगे था, +03: 00। जावा.टाइम फ्रेमवर्क 1 9 75 के पूरे वर्ष +03: 00 के सही परिणाम उत्पन्न करता है। अधिक जानकारी के लिए Time in Russia देखें। चेतावनी: मैं रूस/सोवियत समय में विशेषज्ञ नहीं हूं।


java.time

बारे java.time ढांचे जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशान पुराने legacyjava.util.Date, Calendar, & SimpleDateFormat जैसी समय-समय पर कक्षाएं प्रदान करती हैं।

Joda-Time प्रोजेक्ट, अब maintenance mode में, java.time कक्षाओं में माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • Java SE 8, Java SE 9, और बाद में
    • में निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और सुधारों को जोड़ता है।
  • Java SE 6 और Java SE 7
    • java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा गया है।
  • Android
    • ThreeTenABP परियोजना adapts ThreeTen-backport विशेष रूप से (जैसा कि ऊपर उल्लेख) Android के लिए।
    • How to use ThreeTenABP… देखें।

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, और more