UTC में LocalDateTime में LocalDateTime कन्वर्ट करें


86

UTC में LocalDateTime में LocalDateTime कन्वर्ट करें।

LocalDateTime convertToUtc(LocalDateTime date) {

    //do conversion

}

मैंने नेट पर सर्च किया। लेकिन हल नहीं निकला


4
क्या आपको LocalDateTime के लिए javadoc मिला? यह कहता है: "यह वर्ग समय-क्षेत्र को संग्रहीत या उसका प्रतिनिधित्व नहीं करता है। इसके बजाय, यह तिथि का वर्णन है, जैसा कि जन्मदिन के लिए उपयोग किया जाता है, स्थानीय समय के साथ संयुक्त रूप से एक दीवार घड़ी पर देखा जाता है। यह एक पल का प्रतिनिधित्व नहीं कर सकता है। अतिरिक्त जानकारी जैसे कि ऑफ़सेट या टाइम-ज़ोन के बिना टाइम-लाइन। "
aro_tech

1
आपके प्रश्न का कोई मतलब नहीं है - आपको इस पद्धति के संदर्भ की व्याख्या करनी चाहिए और आप इसे प्राप्त करने का प्रयास कर रहे हैं। ऐसा लगता है कि आपके पास एक बुनियादी गलतफहमी है कि एपीआई के विभिन्न वर्ग क्या दर्शाते हैं।
8

3
यदि आप टाइम-ज़ोन की परवाह करते हैं, तो आपको ज़ोनडेडटाइम का उपयोग करने की आवश्यकता है, जिसमें टाइम-ज़ोन withZoneSameLocal () और withZoneSameInstant () के बीच रूपांतरण विधियाँ हैं
JodaStephen

हां। मै समझ गया। धन्यवाद
सारिका

जवाबों:


104

मैं व्यक्तिगत रूप से पसंद करता हूं

LocalDateTime.now(ZoneOffset.UTC);

जैसा कि यह सबसे पठनीय विकल्प है।


26
क्या यह नया समय (अब) नहीं बनाता है? मूल प्रश्न UTC के लिए एक ज्ञात समय को परिवर्तित करने के बारे में था
एवोवो

हम LocalDateTime से UTC -7: 00
अशोक कुमार गणेशन

74

और भी सरल तरीका है

LocalDateTime.now(Clock.systemUTC())

26
अच्छा लगा, लेकिन मूल प्रश्न का उत्तर नहीं दिया।
एरिरलर

3
यह उत्तर किसी UTC दिनांक को किसी LocalDate में कनवर्ट करता है। मूल प्रश्न यह था कि लोकलडेट को UTC दिनांक में कैसे परिवर्तित किया जाए।
सरू फ्रैंकेनफेल्ड

हम LocalDateTime से UTC -7: 00
अशोक कुमार गणेशन

64

LocalDateTime में ज़ोन जानकारी शामिल नहीं है। ZonedDatetime करता है।

यदि आप LocalDateTime को UTC में बदलना चाहते हैं, तो आपको ZonedDateTime मुट्ठी से लपेटने की आवश्यकता है।

आप नीचे की तरह कन्वर्ट कर सकते हैं।

LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt.toLocalTime());

ZonedDateTime ldtZoned = ldt.atZone(ZoneId.systemDefault());

ZonedDateTime utcZoned = ldtZoned.withZoneSameInstant(ZoneId.of("UTC"));

System.out.println(utcZoned.toLocalTime());

2
यह सही है, हालांकि तकनीकी रूप से लपेटा नहीं गया है। ldt.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC"))जबकि संक्षिप्त अभी भी पर्याप्त उदाहरण चर चर की जरूरत नहीं के लिए अर्थ बता देते हैं।
ब्रेट रायन

22
ZoneOffset.UTCके लिए एक अच्छा प्रतिस्थापन हैZoneI‌​d.of("UTC")
ycomp

2
यूटीसी के लिए, की OffsetDateTimeतुलना में अधिक उपयुक्त है ZonedDateTime। का प्रयोग करें: OffsetDateTime.now( ZoneOffset.UTC )याmyInstant.atOffset( ZoneOffset.UTC )
तुलसी Bourque

15

नीचे का उपयोग करें। यह स्थानीय डेटाटाइम लेता है और समय-सीमा का उपयोग करके इसे यूटीसी में परिवर्तित करता है। आपको इसे फ़ंक्शन बनाने की आवश्यकता नहीं है।

ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);
System.out.println(nowUTC.toString());

यदि आपको ZonedDateTime का LocalDateTime भाग प्राप्त करने की आवश्यकता है तो आप निम्न का उपयोग कर सकते हैं।

nowUTC.toLocalDateTime();

यहाँ एक स्थिर विधि है जिसका उपयोग मैं अपने आवेदन में यूटीसी समय को mysql में सम्मिलित करने के लिए करता हूँ क्योंकि मैं एक डिफ़ॉल्ट मान UTC_TIMESTAMP को एक डेटाइम कॉलम में नहीं जोड़ सकता ।

public static LocalDateTime getLocalDateTimeInUTC(){
    ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);

    return nowUTC.toLocalDateTime();
}

14

यहां एक साधारण सा यूटिलिटी क्लास दिया गया है, जिसका उपयोग आप स्थानीय तिथि समय को ज़ोन से ज़ोन में परिवर्तित करने के लिए कर सकते हैं, जिसमें एक यूटिलिटी विधि भी शामिल है जिसमें वर्तमान ज़ोन से वर्तमान ज़ोन को यूटीसी (मुख्य विधि के साथ बदलना) ताकि आप इसे चला सकें और परिणाम देख सकें एक साधारण परीक्षण):

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public final class DateTimeUtil {
    private DateTimeUtil() {
        super();
    }

    public static void main(final String... args) {
        final LocalDateTime now = LocalDateTime.now();
        final LocalDateTime utc = DateTimeUtil.toUtc(now);

        System.out.println("Now: " + now);
        System.out.println("UTC: " + utc);
    }

    public static LocalDateTime toZone(final LocalDateTime time, final ZoneId fromZone, final ZoneId toZone) {
        final ZonedDateTime zonedtime = time.atZone(fromZone);
        final ZonedDateTime converted = zonedtime.withZoneSameInstant(toZone);
        return converted.toLocalDateTime();
    }

    public static LocalDateTime toZone(final LocalDateTime time, final ZoneId toZone) {
        return DateTimeUtil.toZone(time, ZoneId.systemDefault(), toZone);
    }

    public static LocalDateTime toUtc(final LocalDateTime time, final ZoneId fromZone) {
        return DateTimeUtil.toZone(time, fromZone, ZoneOffset.UTC);
    }

    public static LocalDateTime toUtc(final LocalDateTime time) {
        return DateTimeUtil.toUtc(time, ZoneId.systemDefault());
    }
}

इसके अलावा: अंतिम LocalDateTime backToLocal = DateTimeUtil.toZone (utc, ZoneOffset.UTC, ZoneId.systemDefault ()); System.out.println ("बैक टू लोकल:" + backToLocal);
rjdkolb

9

सवाल?

उत्तर और प्रश्न को देखते हुए, ऐसा लगता है कि प्रश्न को काफी संशोधित किया गया है। तो वर्तमान प्रश्न का उत्तर देने के लिए:

UTC में LocalDateTime में LocalDateTime कन्वर्ट करें।

समय क्षेत्र?

LocalDateTimeसमय-क्षेत्र के बारे में कोई भी जानकारी संग्रहीत नहीं करता है, यह मूल रूप से वर्ष, माह, दिन, घंटा, मिनट, दूसरा और छोटी इकाइयों के मूल्यों को रखता है। तो एक महत्वपूर्ण सवाल यह है कि मूल का समयक्षेत्र क्या है LocalDateTime? यह यूटीसी पहले से ही हो सकता है, इसलिए कोई रूपांतरण नहीं किया जाना चाहिए।

सिस्टम डिफ़ॉल्ट समयक्षेत्र

यह देखते हुए कि आपने वैसे भी प्रश्न पूछा है, तो संभवतः आपका मतलब है कि मूल समय आपके सिस्टम-डिफ़ॉल्ट टाइमज़ोन में है और आप इसे यूटीसी में बदलना चाहते हैं। क्योंकि आमतौर पर एक LocalDateTimeऑब्जेक्ट बनाया जाता है LocalDateTime.now()जिसके उपयोग से सिस्टम-डिफ़ॉल्ट टाइमज़ोन में वर्तमान समय वापस आ जाता है। इस स्थिति में, रूपांतरण निम्नलिखित होगा:

LocalDateTime convertToUtc(LocalDateTime time) {
    return time.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}

रूपांतरण प्रक्रिया का एक उदाहरण:

2019-02-25 11:39 // [time] original LocalDateTime without a timezone
2019-02-25 11:39 GMT+1 // [atZone] converted to ZonedDateTime (system timezone is Madrid)
2019-02-25 10:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2019-02-25 10:39 // [toLocalDateTime] losing the timezone information

स्पष्ट समयक्षेत्र

किसी अन्य मामले में, जब आप स्पष्ट रूप से रूपांतरण करने के लिए समय के समय को निर्दिष्ट करते हैं, तो रूपांतरण निम्नलिखित होगा:

LocalDateTime convertToUtc(LocalDateTime time, ZoneId zone) {
    return time.atZone(zone).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}

रूपांतरण प्रक्रिया का एक उदाहरण:

2019-02-25 11:39 // [time] original LocalDateTime without a timezone
2019-02-25 11:39 GMT+2 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)
2019-02-25 09:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2019-02-25 09:39 // [toLocalDateTime] losing the timezone information

atZone()विधि

atZone()विधि का परिणाम उसके तर्क के रूप में पारित समय पर निर्भर करता है, क्योंकि यह डे-टाइम सेविंग टाइम (डीएसटी) सहित टाइमजोन के सभी नियमों को मानता है। उदाहरणों में, समय 25 फरवरी था, यूरोप में इसका मतलब है कि सर्दियों का समय (डीएसटी नहीं)।

यदि हम एक अलग तारीख का उपयोग करते हैं, तो मान लें कि पिछले वर्ष से 25 अगस्त, परिणाम अलग होगा, डीएसटी पर विचार:

2018-08-25 11:39 // [time] original LocalDateTime without a timezone
2018-08-25 11:39 GMT+3 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)
2018-08-25 08:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2018-08-25 08:39 // [toLocalDateTime] losing the timezone information

GMT का समय नहीं बदलता है। इसलिए अन्य timezones में ऑफसेट समायोजित कर रहे हैं। इस उदाहरण में, एस्टोनिया का ग्रीष्मकालीन समय GMT + 3 और सर्दियों का समय GMT + 2 है।

इसके अलावा, यदि आप घड़ियों को बदलने के एक घंटे के भीतर एक समय निर्दिष्ट करते हैं। जैसे एस्टोनिया के लिए 28 अक्टूबर, 2018 03:30, इसका मतलब दो अलग-अलग समय हो सकता है:

2018-10-28 03:30 GMT+3 // summer time [UTC 2018-10-28 00:30]
2018-10-28 04:00 GMT+3 // clocks are turned back 1 hour [UTC 2018-10-28 01:00]
2018-10-28 03:00 GMT+2 // same as above [UTC 2018-10-28 01:00]
2018-10-28 03:30 GMT+2 // winter time [UTC 2018-10-28 01:30]

मैन्युअल रूप से ऑफ़सेट निर्दिष्ट किए बिना (GMT + 2 या GMT + 3), 03:30समयक्षेत्र के लिए समयEurope/Tallinn का अर्थ दो अलग-अलग UTC बार, और दो अलग-अलग ऑफसेट हो सकते हैं।

सारांश

जैसा कि आप देख सकते हैं, अंतिम परिणाम एक तर्क के रूप में पारित होने के समय के समय पर निर्भर करता है। क्योंकि समयक्षेत्र को LocalDateTimeऑब्जेक्ट से नहीं निकाला जा सकता है , इसलिए आपको यह जानना होगा कि इसे UTC में बदलने के लिए आपके पास कौन सा टाइमज़ोन है।


1
LocalDateTime के बारे में जानकारी के लिए धन्यवाद, समय-क्षेत्र के बारे में कोई जानकारी संग्रहीत नहीं करता है! LocalDateTime does not store any information about the time-zone, it just basically holds the values of year, month, day, hour, minute, second, and smaller units.
लियूवेनबिन_ओ।

5

tldr: ऐसा करने का कोई तरीका नहीं है; यदि आप ऐसा करने का प्रयास कर रहे हैं, तो आपको लोकलडेट टाइम मिल जाएगा गलत है।

इसका कारण है कि LocalDateTime बाद ज़ोन को रिकॉर्ड नहीं करता है। आप किसी विशिष्ट समय क्षेत्र के आधार पर समय क्षेत्र के बिना दिनांक समय को किसी अन्य दिनांक समय में परिवर्तित नहीं कर सकते।

तथ्य की बात के रूप में, LocalDateTime.now () को कभी भी उत्पादन कोड में नहीं बुलाया जाना चाहिए जब तक कि आपका उद्देश्य यादृच्छिक परिणाम प्राप्त नहीं कर रहा हो। जब आप उस तरह एक LocalDateTime इंस्टेंस का निर्माण करते हैं, तो इस आवृत्ति में केवल सर्वर के टाइम ज़ोन के आधार पर तारीख का समय होता है, जिसका अर्थ है कि यह कोड अलग-अलग परिणाम उत्पन्न करेगा यदि यह किसी भिन्न समय क्षेत्र कॉन्फ़िगरेशन के साथ सर्वर चला रहा हो।

LocalDateTime तारीख गणना को सरल बना सकता है। यदि आप वास्तविक रूप से उपयोग करने योग्य डेटा समय चाहते हैं, तो ZonedDateTime या OffsetDateTime का उपयोग करें : https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html


LocalDateTime समय क्षेत्र को रिकॉर्ड नहीं करता है, लेकिन आपको यह ज्ञान कहीं और से हो सकता है और रूपांतरण से पहले इस जानकारी को अपने LocalDateTimes में जोड़ें।
ट्रिस्टन

1

इस विधि का प्रयोग करके देखें।

अपने को परिवर्तित LocalDateTimeकरने के लिए ZonedDateTimeका उपयोग करके की विधि और सिस्टम सामान्य समय क्षेत्र से गुजरती हैं या आप उपयोग कर सकते ZoneId की तरह अपने क्षेत्र केZoneId.of("Australia/Sydney");

LocalDateTime convertToUtc(LocalDateTime dateTime) {
  ZonedDateTime dateTimeInMyZone = ZonedDateTime.
                                        of(dateTime, ZoneId.systemDefault());

  return dateTimeInMyZone
                  .withZoneSameInstant(ZoneOffset.UTC)
                  .toLocalDateTime();
  
}

अपने ज़ोन के स्थानीय दिनांक समय के उपयोग पर वापस जाने के लिए:

LocalDateTime convertFromUtc(LocalDateTime utcDateTime){
    return ZonedDateTime.
            of(utcDateTime, ZoneId.of("UTC"))
            .toOffsetDateTime()
            .atZoneSameInstant(ZoneId.systemDefault())
            .toLocalDateTime();
}

-1

आप कुछ ऐसा करने वाले सहायक को लागू कर सकते हैं:

public static LocalDateTime convertUTCFRtoUTCZ(LocalDateTime dateTime) {
    ZoneId fr = ZoneId.of("Europe/Paris");
    ZoneId utcZ = ZoneId.of("Z");
    ZonedDateTime frZonedTime = ZonedDateTime.of(dateTime, fr);
    ZonedDateTime utcZonedTime = frZonedTime.withZoneSameInstant(utcZ);
    return utcZonedTime.toLocalDateTime();
}

UTC को UTC Z? कुछ भी मतलब नहीं है। UTC = Z, UTC <> fr
ट्रिस्टन

-2
public static String convertFromGmtToLocal(String gmtDtStr, String dtFormat, TimeZone lclTimeZone) throws Exception{
        if (gmtDtStr == null || gmtDtStr.trim().equals("")) return null;
        SimpleDateFormat format = new SimpleDateFormat(dtFormat);
        format.setTimeZone(getGMTTimeZone());
        Date dt = format.parse(gmtDtStr);
        format.setTimeZone(lclTimeZone);
        return

format.format (डीटी); }


1
कृपया लंबे पुराने और कुख्यात परेशान करने वाले SimpleDateFormatवर्ग का उपयोग करने के लिए युवाओं को न सिखाएं । कम से कम पहले विकल्प के रूप में नहीं। और बिना किसी आरक्षण के नहीं। आज हमारे पास java.timeआधुनिक जावा तिथि और समय एपीआई और इसके बहुत बेहतर हैं DateTimeFormatter
ओले वीवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.