क्या कोई तरीका है जोन 8 में जोनऑफ को जोनऑफसेट में बदलने का?


85

मेरे पास एक युगांतर दूसरा और एक क्षेत्र II है, Method1.It को सिस्टम डिफ़ॉल्ट जोनआईड के साथ लोकलडेटाइम में परिवर्तित किया जा सकता है, लेकिन मुझे विधि 2 द्वारा युगांतर को लोकलडेटाइम में बदलने का तरीका नहीं मिल रहा है, क्योंकि ZoneOffset.systemDefaultमुझे नहीं लगता है। मुझे लगता है कि यह अस्पष्ट है।

import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}

val epochSecond = System.currentTimeMillis() / 1000

LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault())//method1
LocalDateTime.ofEpochSecond(epochSecond, 0, ZoneOffset.MAX)//method2

थोक आयात import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}कार्य करने के लिए आप किस भाषा / बोली का उपयोग कर रहे हैं ? यह unexpected tokenमेरे लिए जावा 11 में है
30

1
स्काला हो सकता है, लेकिन यहाँ वास्तव में महत्वपूर्ण नहीं है
donatas M

1
मैंने java.timeयहाँ लंबाई के पीछे के सिद्धांत पर चर्चा की है: stackoverflow.com/a/56508200/145989
17

जवाबों:


109

यहाँ आप कैसे प्राप्त कर सकते हैं ZoneOffsetसे ZoneId:

Instant instant = Instant.now(); //can be LocalDateTime
ZoneId systemZone = ZoneId.systemDefault(); // my timezone
ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);

NB: ZoneIdसमय पर बिंदु और विशेष स्थान के इतिहास के आधार पर अलग-अलग ऑफसेट हो सकते हैं। इसलिए अलग-अलग इंस्टैंट को चुनने से अलग-अलग ऑउटफिट आएंगे।

NB2: यदि / / आदि के बदले समय क्षेत्र के विपरीत पारित किया जाता है , तो बदले में ZoneId.of()वापस कर सकते हैं । इसलिए यदि UTC / GMT ऑफ़सेट पास किए जाते हैं, तो ऐतिहासिक / भौगोलिक / दिन के उजाले की बचत की जानकारी को ध्यान में नहीं रखा जाएगा - आप बस निर्दिष्ट ऑफसेट के साथ काम करेंगे।ZoneOffsetZoneIdUTC+3GMT+2Africa/CairoInstant


यह गलत मूल्य देता है यदि वर्तमान इंस्टेंट डीएसटी में है, लेकिन गणना के क्षण में यह डीएसटी के बिना था
msangel

@msangel, क्या आप दोबारा जांच कर सकते हैं? हो सकता है कि आप ZoneId.systemDefault()अपने कोड में उपयोग कर रहे हों और यह विभिन्न मशीनों पर अलग-अलग समय क्षेत्र लौटाता हो?
स्टैनिस्लाव बश्किर्तसेव

मैंने जाँच की कि यह एक और शर्त पर निर्भर करता है। उस के साथ अद्यतन जवाब।
मि। इंजील

43

कोई एक-से-एक मैपिंग नहीं है। एक जोनआईड एक भौगोलिक सीमा को परिभाषित करता है जिसमें समय के साथ विभिन्न जोनऑफ़सेट का एक सेट उपयोग किया जाता है। यदि समय क्षेत्र डेलाइट सेविंग टाइम का उपयोग करता है, तो इसका जोनऑफसेट गर्मियों और सर्दियों के बीच अलग होगा।

इसके अलावा, दिन के समय की बचत के समय के नियम समय के साथ बदल सकते हैं, इसलिए जोनऑफसेट 13/10/1980 की तुलना में 13/10/2015 के लिए अलग हो सकता है।

तो आप किसी विशेष इंस्टैंट पर केवल जोनऑड के लिए जोनऑफसेट पा सकते हैं।

Https://en.wikipedia.org/wiki/Tz_database भी देखें


10
मुझे यह पता है, लेकिन यह कैसे किया जाता है? अगर मुझे लोकेडेट पता है और एक जोनआईड है, तो मैं इसे जोनऑफसेट में कैसे बदल सकता हूं। मेरा उपयोग-केस एक स्ट्रिंग है जिसमें एक समय और एक ज़ोन होता है। मैं ज़ोन की जानकारी को छोड़ने के बिना, एक ऑफसेटसेट में स्ट्रिंग को पार्स करना चाहता हूं।
काई मोरित्ज़

33

tl; डॉ

ZonedDateTime.now( 
    ZoneId.of( "America/Montreal" ) 
)

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

ZonedDateTime.now( 
    ZoneId.systemDefault() 
)

विवरण

स्टानिस्लाव Bshkyrtsev द्वारा जवाब सही ढंग से और सीधे अपने सवाल का जवाब।

लेकिन, इसमें बड़े मुद्दे शामिल हैं, जैसा कि जॉन स्कीट द्वारा उत्तर में सुझाया गया है ।

LocalDateTime

मुझे लोकल टाइमटाइम के लिए दूसरा युग बदलने का तरीका नहीं मिला

LocalDateTimeजानबूझकर समय क्षेत्र या ऑफसेट-यूटीसी की कोई अवधारणा नहीं है। संभावना नहीं कि आप क्या चाहते हैं। किसी भी इलाके का Local…मतलब है, किसी एक इलाके का नहीं। यह वर्ग एक क्षण का प्रतिनिधित्व नहीं करता है, केवल संभावित क्षण लगभग 26-27 घंटे (दुनिया भर के समय क्षेत्रों की सीमा) के साथ।

Instant

यदि आप वर्तमान समय प्राप्त करने की कोशिश कर रहे हैं, तो युगों से शुरू होने की आवश्यकता नहीं है। वर्तमान प्राप्त करें InstantInstantकक्षा में समय रेखा पर एक पल का प्रतिनिधित्व करता यूटीसी के एक संकल्प के साथ नैनोसेकंड (नौ (9) एक दशमलव भिन्न के अंकों के लिए)।

Instant instant = Instant.now();

इसके अंदर नैनोसेकंड -फ्रॉम-एपोच Instantकी गिनती है । लेकिन हम वास्तव में परवाह नहीं करते हैं।

ZonedDateTime

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

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

शॉर्टकट के रूप में, आप सीधे कर सकते हैं ZonedDateTime

ZonedDateTime zdt = ZonedDateTime.now( z );  

एक ZonedDateTimeएक है Instantयह के भीतर। यूटीसीzdt.toInstant() में एक मूल मूल्य के रूप में समय में एक ही क्षण प्राप्त करने के लिए कॉल करें । या तो जिस तरह से, एक के रूप में या तो नैनोसेकंड्स की एक ही संख्या ।ZonedDateTimeInstant

सेकंड-बाद-युग दिया गया

यदि आपको सेकंड-के-बाद की अवधि दी जाती है, और यूटीसी ( 1970-01-01T00:00:00Z) में 1970 का पहला क्षण है , तो उस संख्या को फ़ीड करें Instant

long secondsSinceEpoch = 1_484_063_246L ;
Instant instant = Instant.ofEpochSecond( secondsSinceEpoch ) ;

जावा में तिथि-समय प्रकारों की तालिका, दोनों आधुनिक और विरासत।


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

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

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

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

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

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

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


10

जैसा कि प्रलेखन कहता है, "यह मुख्य रूप से सामान्य अनुप्रयोग उपयोग के बजाय निम्न-स्तरीय रूपांतरणों के लिए अभिप्रेत है।"

के माध्यम से जा रहा Instantहै मुझे सही समझ में आता है - अपने युग दूसरे प्रभावी रूप से एक का एक अलग प्रतिनिधित्व है Instant, तो एक में परिवर्तित करने Instantऔर फिर एक विशेष समय क्षेत्र में परिवर्तित करें।


9

मुझे आशा है कि नीचे दिए गए मेरे समाधान की पहली दो पंक्तियाँ मददगार हैं। मेरी समस्या यह थी कि मेरे पास एक LocalDateTimeसमय क्षेत्र का नाम और एक नाम था , और मुझे एक की आवश्यकता थी instantइसलिए मैं एक निर्माण कर सकता था java.util.Date, क्योंकि यह वही है जो MongoDB चाहता था। मेरा कोड स्काला है, लेकिन यह जावा के इतना करीब है कि मुझे लगता है कि इसे समझने में कोई समस्या नहीं होनी चाहिए:

val zid = ZoneId.of(tzName)                                // "America/Los_Angeles"
val zo: ZoneOffset = zid.getRules.getOffset(localDateTime) // ⇒ -07:00
                                         // 2017-03-16T18:03

val odt = OffsetDateTime.of(localDateTime, zo) // ⇒ 2017-03-16T18:03:00-07:00
val instant = odt.toInstant                    // ⇒ 2017-03-17T01:03:00Z
val issued = Date.from(instant)

1
मैंने इस उत्तर को यहां पोस्ट किया क्योंकि यह वह पृष्ठ था जो तब आया जब मैं वह करने के लिए एक रास्ता खोज रहा था जिसे मैंने अंततः खोज लिया।
gknauth

1

इस समय क्षेत्र में मानक समय प्राप्त करने के लिए UTC को जोड़ने के लिए मिलीसेकंड में निम्नलिखित समय की मात्रा देता है:

TimeZone.getTimeZone(ZoneId.of("Europe/Amsterdam")).getRawOffset()

0

मेरे पास एक युग दूसरा और एक जोनआईड है। क्या कोई तरीका है जोन 8 में जोनऑफ को जोनऑफसेट में बदलने का?

  1. ZonedDateTimeयुग दूसरी और ज़ोन आईडी से प्राप्त करें
  2. जाओ ZoneOffsetसेZonedDateTime

डेमो:

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

public class Main {
    public static void main(String[] args) {
        // Get ZonedDateTime from epoch second and Zone Id
        ZonedDateTime zdt = Instant.ofEpochSecond(1597615462L).atZone(ZoneId.of("Europe/London"));

        // Get ZoneOffset from ZonedDateTime
        ZoneOffset offset = zdt.getOffset();

        System.out.println(offset);
    }
}

आउटपुट:

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