2016-12-21 12 views
6

में जीटीटी में यूटीसी ऑफ़सेट के साथ दिनांक समय मूल्य को कैसे परिवर्तित करें मेरे पास दिनांक दिनांक मूल्य 2016-12-21T07: 48: 36 है जो यूटीसी +14 के ऑफसेट के साथ है। डेटाटाइम को बराबर मानक जीएमटी समय में कैसे परिवर्तित करें।जावा 7

मैंने sampleDateFormat.parse() विधि के साथ प्रयास किया। लेकिन, मैं यूटीसी ऑफसेट के लिए टाइमज़ोन ऑब्जेक्ट प्राप्त करने में सक्षम नहीं हूं।

sampleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC+14:00")) 

कृपया मुझे जावा 7.

+0

आप जानते हैं कि आपकी समस्या केवल इसलिए है कि आपने असमर्थित "यूटीसी +14" का उपयोग किया था। GetTimeZone केवल "जीएमटी + एक्सएक्स" फॉर्म – Sxilderik

+0

जानता है आपको ** + 14 ** ऑफ़सेट कहां से मिला? –

उत्तर

2

में मानक GMT समय में यूटीसी datetime कन्वर्ट करने के लिए मैं तुम्हें एक स्ट्रिंग के रूप में मूल तिथि समझेंगे मदद करते हैं। निम्न कार्य करें:

  • समय क्षेत्र "GMT + 14"
  • स्ट्रिंग मान पार्स करने के लिए एक SimpleDateFormat बनाएँ और निर्धारित किया है। आप एक Date वस्तु
  • SimpleDateFormat करने के लिए "यूटीसी" के समयक्षेत्र सेट मिल (या एक अलग SimpleDateFormat उदाहरण का उपयोग करें)
  • स्वरूप तिथि (तुम भी एक स्ट्रिंग के रूप परिणाम चाहते हैं)

उदाहरण:

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

public class ConvertToUTC { 
    public static void main(String[] args) throws Exception { 

     String dateval = "2016-12-21T07:48:36"; 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
     df.setTimeZone(TimeZone.getTimeZone("GMT+14")); 
     Date date = df.parse(dateval); 

     System.out.println(df.format(date)); // GMT+14 

     df.setTimeZone(TimeZone.getTimeZone("UTC")); 
     System.out.println(df.format(date)); // UTC 
    } 
} 
+0

क्या यूटीसी + ऑफ़सेट के बजाय जीएमटी + ऑफ़सेट का उपयोग करते हैं तो दिन प्रकाश प्रकाश घटक पर विचार किया जाएगा? – GOPI

+0

@GOPI उत्तर सही है। आपका प्रश्न केवल निश्चित ऑफ़सेट का उल्लेख करता है (और यदि यह उपसर्ग जीएमटी या यूटीसी है तो यह बराबर है)। इसलिए दिन-प्रकाश-बचत आपके प्रश्न के संदर्भ में अप्रासंगिक है।अन्यथा निश्चित ऑफसेट का उपयोग न करें, लेकिन "एशिया/टोक्यो" आदि जैसे टाइमज़ोन पहचानकर्ता –

+0

धन्यवाद मेनो और ग्रोड्रिगेज! – GOPI

2

उपयोग "GMT + 14: 00" के बदले "UTC + 14: 00"

SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss"); 
f.setTimeZone(TimeZone.getTimeZone("GMT+14:00")); 
final Date d = f.parse("2016-12-21T07:48:36"); 
f.setTimeZone(TimeZone.getTimeZone("UTC")); 
System.out.println(f.format(d)); // -> 2016-12-20T05:48:36 
2

tl; डॉ

LocalDateTime.parse("2016-12-21T07:48:36")  // Parse as a `LocalDateTime` given the lack of an offset or zone. *Not* an actual moment, only a rough approximation of potential moments along a range of about 26-27 hours. 
      .atOffset(ZoneOffset.ofHours(14)) // Assign an offset-from-UTC as context, giving meaning to determine an actual point on the timeline. 
      .toInstant()       // Renders `Instant` object in UTC. 

java.time

आधुनिक तरीका java.time जावा 8 और बाद में बनाया गया वर्गों के साथ है। ThreeTen-Backport प्रोजेक्ट में अधिकांश कार्यक्षमता जावा 6 & 7 पर बैक-पोर्ट की गई है।

ZoneOffset offset = ZoneOffset.ofHours(14); // fourteen hours ahead of UTC. 

एक LocalDateTime के रूप में स्ट्रिंग पार्स के रूप में इसके बारे में ऑफसेट या क्षेत्र कोई भी जानकारी का अभाव है। आपका इनपुट मानक ISO 8601 प्रारूप में है, इसलिए फ़ॉर्मेटिंग पैटर्न निर्दिष्ट करने की आवश्यकता नहीं है।

LocalDateTime ldt = LocalDateTime.parse("2016-12-21T07:48:36"); 

किसी ऑब्जेक्ट को OffsetDateTime प्राप्त करने के लिए ऑफसेट को स्थानीय दिनांक-समय पर लागू करें।

OffsetDateTime odt = ldt.atOffset(offset); 

कि से, एक Instant जो UTC में हमेशा होता है निकालें।

Instant instant = odt.toInstant(); 

instant.toString(): 2016-12-20T17: 48: 36Z

UTC में, मूल्य एक अलग तिथि, 21 वीं की बजाय 20 वीं है।

live code at IdeOne.com देखें।


बारे java.time

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

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

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

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

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

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

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

+0

किसी भी समय क्षेत्र में तकनीकी रूप से 'इंस्टेंट' "नहीं है"। यह युग से ऑफसेट का प्रतिनिधित्व करता है। – OrangeDog

+2

@ ऑरेंजडॉग गलत। एक 'त्वरित' निश्चित रूप से यूटीसी में है। कक्षा दस्तावेज़ को उद्धृत करने के लिए: "युग-सेकंड को 1 9 70-01-01T00: 00: 00Z के मानक जावा युग से मापा जाता है"। वह 'ज़ेड' ज़ुलू के लिए छोटा है और इसका मतलब यूटीसी है। यूटीसी के रूप में परिभाषित किए बिना 'तत्काल' का कोई अर्थ नहीं होगा। –

+0

सिर्फ इसलिए कि दस्तावेज़ों में युग का युग जेड में है, इसका मतलब यह नहीं है कि 'इंस्टेंट' है। कक्षा दस्तावेज़ को उद्धृत करने के लिए: "यह जावा एपीआई अपना समय-समय, जावा टाइम-स्केल परिभाषित करता है"। – OrangeDog