जावा 8 में UTC + 0 दिनांक कैसे प्राप्त करें?


108

मुझे जावा में डेट क्लास की समस्या है। दिनांक वर्ग स्थानीय मशीन की तारीख देता है लेकिन मुझे UTC-0 की आवश्यकता होती है।

मैं googled और जावास्क्रिप्ट के लिए महान समाधान मिला है, लेकिन जावा के लिए कुछ भी उपयोगी नहीं है।

जावा 8 में UTC + 0 दिनांक कैसे प्राप्त करें?


12
java.util.Dateकभी भी स्थानीय मशीन की तारीख नहीं होती है। यह हमेशा UTC + 00: 00 के सापेक्ष 1970-01-01 के बाद से बीमित मिलीसेक के रूप में परिभाषित किया गया है। हो सकता है कि इसकी पद्धति का व्यवहार toString()आपको भ्रमित करता हो जो वास्तव में स्थानीय समय क्षेत्र में प्रतिनिधित्व का उपयोग करता है।
मेनो होच्स्चिल्ड

एक संभावित उत्तर प्रश्न में पाया जा सकता है: stackoverflow.com/questions/45350095/…
प्रिया जैन

जवाबों:


146

जावा 8 के साथ आप लिख सकते हैं:

OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);

अपनी टिप्पणी का उत्तर देने के लिए, आप इसे एक तिथि में बदल सकते हैं (जब तक कि आप विरासत कोड पर निर्भर न हों मुझे कोई कारण नहीं दिखता) या युगों के बाद से मिलिस:

Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;

1
धन्यवाद। यह संभव है कि ZonedDateTime को दिनांक या लंबे (ms) में रूपांतरित करें?
मार्क

7
जबकि यह उत्तरदाता कोड तकनीकी रूप से काम करता है, क्या यह पूर्ण समय क्षेत्र के बजाय केवल ऑफसेट-यूटीटीसी के साथ काम करने के OffsetDateTimeबजाय उपयोग करने के लिए अधिक उपयुक्त नहीं होगा ZonedDateTime?
तुलसी बॉर्क

179

tl; डॉ

Instant.now()

java.time

जावा के शुरुआती संस्करणों के साथ बंडल की गई पुरानी पुरानी डेट-टाइम कक्षाओं को जावा 8 और बाद में निर्मित java.time कक्षाओं द्वारा दबा दिया गया है। ओरेकल ट्यूटोरियल देखें । कार्यक्षमता की ज्यादातर में जावा 6 और 7 को वापस भेजा जा चुका है ThreeTen-backport और आगे में एंड्रॉयड के लिए अनुकूलित ThreeTenABP

Instant

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

Instant instant = Instant.now();

toStringविधि पाठ मानक से एक का उपयोग तिथि-समय मान से स्ट्रिंग ऑब्जेक्ट उत्पन्न करता है आईएसओ 8601 प्रारूपों।

String output = instant.toString();  

2016-06-27T19: 15: 25.864Z

Instantवर्ग java.time में एक बुनियादी इमारत ब्लॉक वर्ग है। UTC में तारीख-समय के मूल्यों को ट्रैक करने, संग्रहीत करने और विनिमय करने के लिए आमतौर पर सबसे अच्छा अभ्यास है, दिनांक-समय को संभालते समय यह आपकी गो-क्लास होनी चाहिए।

OffsetDateTime

लेकिन Instantसीमाएँ हैं जैसे कि वैकल्पिक स्वरूपों में तार पैदा करने के लिए कोई प्रारूपण विकल्प नहीं। अधिक लचीलेपन के लिए, से कन्वर्ट Instantकरें OffsetDateTime। एक ऑफसेट-यूटीसी से निर्दिष्ट करें । Java.time में कि एक ZoneOffsetवस्तु का मतलब है । यहां हम UTC (+00) के साथ रहना चाहते हैं ताकि हम सुविधाजनक स्थिरांक का उपयोग कर सकें ZoneOffset.UTC

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

2016-06-27T19: 15: 25.864Z

या Instantकक्षा को छोड़ दें ।

OffsetDateTime.now( ZoneOffset.UTC )

अब OffsetDateTimeहाथ में एक वस्तु के साथ , आप DateTimeFormatterस्ट्रिंग को वैकल्पिक स्वरूपों में पाठ के साथ ऑब्जेक्ट बनाने के लिए उपयोग कर सकते हैं । उपयोग करने के कई उदाहरणों के लिए स्टैक ओवरफ्लो खोजें DateTimeFormatter

ZonedDateTime

जब आप कुछ विशेष समय क्षेत्र के लिए दीवार-घड़ी समय प्रदर्शित करना चाहते हैं , तो ए ZoneIdप्राप्त करने के लिए आवेदन करें ZonedDateTime

इस उदाहरण में हम मॉन्ट्रियल समय क्षेत्र लागू करते हैं। गर्मियों में, डेलाइट सेविंग टाइम (DST) बकवास के तहत , ज़ोन की भरपाई होती है -04:00। इसलिए ध्यान दें कि आउटपुट 15के लिए 19दिन का समय घंटे के बजाय चार घंटे पहले कैसे होता है । Instantऔर ZonedDateTimeदोनों बहुत ही समान क्षण का प्रतिनिधित्व करते हैं, बस दो अलग-अलग लेंसों के माध्यम से देखा जाता है।

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

2016-06-27T15: 15: 25.864-04: 00 [अमेरिका / मॉन्ट्रियल]

परिवर्तित

जबकि आपको पुरानी तारीखों की कक्षाओं से बचना चाहिए, यदि आपको पुरानी कक्षाओं में जोड़े गए नए तरीकों का उपयोग करके परिवर्तित करना होगा। यहाँ हम उपयोग करते हैं java.util.Date.from( Instant )और java.util.Date::toInstant

java.util.Date utilDate = java.util.Date.from( instant );

और दूसरी दिशा में जा रहा है।

Instant instant= utilDate.toInstant();

इसी तरह, GregorianCalendar( से (उपवर्ग Calendar) में जोड़े गए नए तरीकों की तलाश करें ताकि उन्हें और इससे परिवर्तित किया जा सके java.time.ZonedDateTime

आधुनिक java.time बनाम विरासत में तारीख-समय वर्गों के प्रकार।

जावा के बारे में

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

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं । हाइबरनेट 5 और जेपीए 2.2 जावा का समर्थन करते हैंjava.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?


3
डीएसटी को गैर-
समझदार

इसलिए यदि DST मौजूद नहीं था, ZonedDateTimeतो इसकी आवश्यकता नहीं थी क्योंकि सभी ZoneIdएक के लिए मैप करेंगे जिसका ZoneOffsetहम उपयोग कर सकते हैं OffsetDateTime?
विल्मॉल

1
@wilmol नंबर डेलाइट सेविंग टाइम (डीएसटी) केवल एक ही कारण है कि राजनेता उन क्षेत्रों के भीतर समय क्षेत्र की सीमाओं और ऑफसेट को फिर से परिभाषित करना चुनते हैं। हाल ही में उत्तर कोरिया ने राजनयिक कारणों से दक्षिण कोरिया के साथ तालमेल करने के लिए अपनी घड़ी को आधे घंटे में बदल दिया। युद्ध में, आक्रमणकारियों / रहने वालों को घर के देश से मेल खाने के लिए ऑफसेट बदल सकते हैं। वर्तमान में एक नई सनक है जहां सरकारें DST परिवर्तनों को रोकने के लिए चयन कर रही हैं, लेकिन अपने मानक समय पर वापस लौटने के बजाय DST पर स्थायी रूप से रह रही हैं । हमेशा बदलने वाले हर क्षेत्र की ऑफसेट योजना या आपका ऐप अंततः टूट जाएगा।
तुलसी बोर्क

1
शानदार जवाब! मैं वास्तव में आपके द्वारा इसमें लगाए गए समय की सराहना करता हूं। :)
२१:०० बजे

ज़ोनआईड.ऑफ़ ("अमेरिका / मॉन्ट्रियल"); jdk में कोई ऐसी चीज़ का आविष्कार क्यों करेगा? यह बदसूरत, घृणित है, यह नहीं बताना कि क्या रन-टाइम तक कुछ भी गलत है, उन सभी हार्ड कोड को कौन याद रख सकता है? ENUM वर्ग में इसे क्यों नहीं निहित किया?
वर्कप्लेलिफ़साइकल

4

Java8 में, मैं उस Instantक्लास का उपयोग करूंगा जो पहले से ही UTC में है और साथ काम करने के लिए सुविधाजनक है।

import java.time.Instant;

Instant ins = Instant.now();
long ts = ins.toEpochMilli();

Instant ins2 = Instant.ofEpochMilli(ts)

वैकल्पिक रूप से, आप निम्नलिखित का उपयोग कर सकते हैं:

import java.time.*;

Instant ins = Instant.now(); 

OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));

वापस Instant

Instant ins4 = Instant.from(odt);

3
नहीं, एक Instantहै नहीं स्थानीय समय पर। एक Instantपरिभाषा UTC में है। यूटीसी में जाने की कोशिश कर रहे इस उत्तर में देखी गई मशालों की कोई आवश्यकता नहीं है; Instantपहले से ही है यूटीसी में। अधिक जानकारी और अधिक सरल कोड के लिए मेरा उत्तर देखें ।
तुलसी बॉर्क

टिप्पणी के लिए धन्यवाद।
अबेल तेरेफ


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.