java.time
मार्च 2014 में जावा एसई 8 की रिलीज के साथ, पुरानी और त्रुटि-प्रवण विरासत डेट-टाइम एपीआई (java.util
दिनांक-समय प्रकार और उनके स्वरूपण प्रकार, SimpleDateFormat
आदि) java.time
. द्वारा प्रतिस्थापित किया गया था , आधुनिक दिनांक-समय API। निम्न तालिका
java.time
. के साथ ANSI SQL प्रकारों की मैपिंग को दर्शाता है प्रकार:
एएनएसआई एसक्यूएल | <थ>जावा एसई 8|
---|---|
तारीख | स्थानीय दिनांक |
समय | स्थानीय समय |
टाइमस्टैम्प | LocalDateTime |
TIMEZONE के साथ समय | ऑफ़सेटटाइम |
टाइमज़ोन के साथ टाइमस्टैम्प | ऑफ़सेटडेटटाइम |
ध्यान दें कि ZonedDateTime
और Instant
किसी भी JDBC ड्राइवर द्वारा समर्थित नहीं हैं जबकि कुछ ड्राइवर उदा। PostgreSQL भी OffsetTime
का समर्थन नहीं करता है / TIME [ WITHOUT TIMEZONE ]
. साथ ही, ध्यान दें कि सभी OffsetDateTime
उदाहरण यूटीसी में होना चाहिए (ऑफसेट 0 है)। ऐसा इसलिए है क्योंकि बैकएंड उन्हें यूटीसी के रूप में संग्रहीत करता है।
JDBC में इसका उपयोग कैसे करें?
वर्तमान OffsetDateTime
को सम्मिलित करने के लिए एक नमूना कोड नीचे दिया गया है UTC में, columnfoo
. में (जो TIMESTAMP WITH TIMEZONE
. का है टाइप करें):
OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();
एक Instant
समयरेखा पर एक तात्कालिक बिंदु का प्रतिनिधित्व करता है और एक समय क्षेत्र से स्वतंत्र होता है यानी इसमें +00:00
का समय क्षेत्र ऑफसेट होता है घंटे।
OffsetDateTime
retrieve को पुनः प्राप्त करने के लिए नीचे एक नमूना कोड दिया गया है columnfoo
. से :
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE <some condition>");
while (rs.next()) {
// Assuming the column index of columnfoo is 1
OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class));
System.out.println(odt);
}
rs.close();
st.close();
बस अगर आपको एक OffsetDateTime
को बदलने की जरूरत है एक अलग ऑफसेट के साथ दूसरे में:
ऐसा करने के कई तरीके हैं लेकिन मैं ज्यादातर OffsetDateTime#withOffsetSameInstant
, एक OffsetDateTime
. कन्वर्ट करने के लिए एक अलग टाइमज़ोन ऑफ़सेट के साथ दूसरे में उदा.
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
// A sample OffsetDateTime in UTC.
OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
System.out.println(odt);
OffsetDateTime offsetTimeAtOffset0100 = odt.withOffsetSameInstant(ZoneOffset.of("+02:00"));
System.out.println(offsetTimeAtOffset0100);
// Time at JVM's default timezone offset
ZoneOffset jvmTzOffset = ZonedDateTime.now(ZoneId.systemDefault()).getOffset();
OffsetDateTime offsetTimeAtJvmTzOffset = odt.withOffsetSameInstant(jvmTzOffset);
System.out.println(offsetTimeAtJvmTzOffset);
}
}
आउटपुट:
2021-05-29T13:36:15.258076Z
2021-05-29T15:36:15.258076+02:00
2021-05-29T14:36:15.258076+01:00
ऊपर दिए गए कोड से संबंधित कुछ बिंदु:
- द
Z
आउटपुट में टाइमज़ोन डिज़ाइनर है शून्य-समय क्षेत्र ऑफसेट के लिए। यह ज़ुलु के लिए खड़ा है औरEtc/UTC
. को निर्दिष्ट करता है टाइमज़ोन (जिसमें टाइमज़ोन ऑफ़सेट+00:00
. है घंटे)। - कोड कन्वर्ट करता है
odt
OffsetDateTime
. के दो उदाहरणों में - प्रत्येक एक अलग तरीके से। पहला उदाहरण+02:00
. के एक निश्चित समय क्षेत्र ऑफसेट के साथ है घंटे जबकि दूसरा जेवीएम के टाइमज़ोन ऑफ़सेट के साथ है। ध्यान दें कि DST देखने वाले स्थान का टाइमज़ोन ऑफ़सेट गर्मी/सर्दियों के समय के अनुसार परिवर्तन। इसलिए, यदि कोई स्थान निश्चित टाइमज़ोन ऑफ़सेट का उपयोग करने के बजाय डीएसटी देखता है, उदा।+02:00
घंटे; हमें इसे एपीआई से प्राप्त करना चाहिए। - मेरे JVM का टाइमज़ोन
Europe/London
है और वर्तमान में इसकी ऑफसेट+01:00
. है घंटे।
आधुनिक दिनांक-समय APIके बारे में अधिक जानें ए> से ट्रेल:दिनांक समय ।