LocalDate और LocalDateTime से युग कैसे निकालें?


102

या के Longउदाहरण से मैं युग मूल्य कैसे निकालूं ? मैंने निम्नलिखित कोशिश की है, लेकिन यह मुझे अन्य परिणाम देता है:LocalDateTimeLocalDate

LocalDateTime time = LocalDateTime.parse("04.02.2014  19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy  HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105

मैं जो चाहता हूं 1391539861, वह स्थानीय डेटाइम के लिए मूल्य है "04.02.2014 19:51:01"। मेरा समय क्षेत्र Europe/OsloUTC + 1 है जिसमें दिन के समय की बचत होती है।


कृपया अपना अपेक्षित नंबर 1396468261 बताएं। मैं बिना टाइमजोन करेक्शन के: 1391543461 (मेरे जवाब में संपादित देखें)। 57 दिन का अंतर!
मेन्हो होचस्चिल्ड

@MenoHochschild मैंने टाइमजोन जानकारी के साथ अपना प्रश्न अपडेट किया है और जीटीएम से स्थानीय स्तर पर वास्तविक मूल्य को सही किया है। LocalDateTimeमैन्युअल रूप से गणना करने के अलावा कुछ और का युग प्राप्त करने का एक आसान तरीका है?

मेरे ठहराव से वापस आकर, मेरा अपडेट देखें।
मेनो होच्स्चिल्ड

जवाबों:


147

कक्षाएं LocalDateऔर समय-समय या समय ऑफसेट केLocalDateTime बारे में जानकारी शामिल नहीं है , और सेकंड के बाद से इस जानकारी के बिना अस्पष्ट होगा। हालाँकि, ऑब्जेक्ट्स के पास एक आवृत्ति पास करके टाइमज़ोन के साथ दिनांक / समय ऑब्जेक्ट में कनवर्ट करने के लिए कई विधियाँ हैं ।ZoneId

LOCALDATE

LocalDate date = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = date.atStartOfDay(zoneId).toEpochSecond();

LocalDateTime

LocalDateTime time = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = time.atZone(zoneId).toEpochSecond();

2
क्या यह संभव है कि जोनआईडी का उपयोग करने से बचें, या एक अनुकूलित, निरंतर जोनआईड उदाहरण (+0, जिसका अर्थ है जीएमटी) के साथ उपयोग करें? मैं यह पूछता हूं क्योंकि मैं चाहता हूं कि सभी गणनाएं इसे सामान्यीकृत करें। इसके अलावा, मैं इसके विपरीत कैसे कर सकता हूं: युगांतर से लोकलडेट / लोकलडेट टाइम (जोनआईड के बिना, या जीएमटी एक के साथ) में परिवर्तित करें?
एंड्रॉइड डेवलपर

2
कोई बात नहीं। यह पाया:ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))
Android डेवलपर

7
एक सरल दृष्टिकोण सिर्फ long epoch = time.toEpochSecond(ZoneOffset.UTC)यूटीसी मामलों के लिए है, या जहां आप पहले से ही समय क्षेत्र जानते हैं, या long epoch = time.toEpochSecond(ZoneId.systemDefault());यदि आप उस मार्ग पर जाना चाहते हैं।
मार्कस

यह हास्यास्पद लग सकता है, लेकिन यह कैसे युगांतर से लोकलडेट, लोकलटाइम और लोकलडेटटाइम में परिवर्तित होने के बारे में है
सैमुअल ओविनो

कोई बात नहीं मुझे लगता है कि मैंने इसे पाया; Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
सैमुअल ओविनो

27

'यूनिक्स के बाद से मिलिस' एक पल का प्रतिनिधित्व करता है, इसलिए आपको तत्काल वर्ग का उपयोग करना चाहिए:

private long toEpochMilli(LocalDateTime localDateTime)
{
  return localDateTime.atZone(ZoneId.systemDefault())
    .toInstant().toEpochMilli();
}

इसका उपयोग करना गलत है ZoneId.systemDefault()क्योंकि यूनिक्स का युग यूटीसी को संदर्भित करता है
एसीवी

10

आपके द्वारा आवश्यक रूपांतरण की आवश्यकता UTC / Greewich, या समय-क्षेत्र से होती है।

आप एक कम करते हैं, तो उसके लिए है समर्पित विधि पर LocalDateTimeइस कार्य के लिए:

long epochSec = localDateTime.toEpochSecond(zoneOffset);

आप केवल एक है, तो ZoneIdफिर आप प्राप्त कर सकते हैं ZoneOffsetसे ZoneId:

ZoneOffset zoneOffset = ZoneId.of("Europe/Oslo").getRules().getOffset(ldt);

लेकिन आप ZonedDateTimeसरलता से रूपांतरण पा सकते हैं :

long epochSec = ldt.atZone(zoneId).toEpochSecond();

4
आप केवल यूटीसी के बारे में परवाह है, वहाँ हैlong epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);
ruhong

2

पर देखो इस विधि जो क्षेत्रों का समर्थन कर रहे हैं। आप के लिए मिल जाएगा LocalDateTime:

NANO_OF_SECOND 
NANO_OF_DAY 
MICRO_OF_SECOND 
MICRO_OF_DAY 
MILLI_OF_SECOND 
MILLI_OF_DAY 
SECOND_OF_MINUTE 
SECOND_OF_DAY 
MINUTE_OF_HOUR 
MINUTE_OF_DAY 
HOUR_OF_AMPM 
CLOCK_HOUR_OF_AMPM 
HOUR_OF_DAY 
CLOCK_HOUR_OF_DAY 
AMPM_OF_DAY 
DAY_OF_WEEK 
ALIGNED_DAY_OF_WEEK_IN_MONTH 
ALIGNED_DAY_OF_WEEK_IN_YEAR 
DAY_OF_MONTH 
DAY_OF_YEAR 
EPOCH_DAY 
ALIGNED_WEEK_OF_MONTH 
ALIGNED_WEEK_OF_YEAR 
MONTH_OF_YEAR 
PROLEPTIC_MONTH 
YEAR_OF_ERA 
YEAR 
ERA 

फ़ील्ड INSTANT_SECONDS निश्चित रूप से है - समर्थित नहीं है क्योंकि LocalDateTimeकिसी भी पूर्ण (वैश्विक) टाइमस्टैम्प का संदर्भ नहीं दे सकता है। लेकिन जो मददगार है वह क्षेत्र है © _DAY जो 1970-01-01 के बाद से बीते हुए दिनों को गिनता है। इसी तरह के विचार प्रकार के लिए मान्य हैं LocalDate(कम समर्थित क्षेत्रों के साथ)।

यदि आप गैर-मौजूदा मिलिस-से-यूनिक्स-युग क्षेत्र प्राप्त करने का इरादा रखते हैं, तो आपको स्थानीय से वैश्विक प्रकार में परिवर्तित होने के लिए भी समय-क्षेत्र की आवश्यकता है। यह रूपांतरण बहुत सरल किया जा सकता है, अन्य एसओ-पोस्ट देखें

आपके प्रश्न और आपके कोड के नंबरों पर वापस आना:

The result 1605 is correct
  => (2014 - 1970) * 365 + 11 (leap days) + 31 (in january 2014) + 3 (in february 2014)
The result 71461 is also correct => 19 * 3600 + 51 * 60 + 1

1970-01-01T00: 00: 00 (ध्यान, कोई समयक्षेत्र) के बाद से 16105L * 86400 + 71461 = 1391543461 सेकंड तब आप टाइमज़ोन ऑफसेट (मिलिसेकंड में 1000 तक संभावित गुणा के लिए बाहर घड़ी) घटा सकते हैं।

दिए गए समयक्षेत्र की जानकारी के बाद अद्यतन करें:

local time = 1391543461 secs
offset = 3600 secs (Europe/Oslo, winter time in february)
utc = 1391543461 - 3600 = 1391539861

JSR-310-दो समान दृष्टिकोण वाले कोड:

long secondsSinceUnixEpoch1 =
  LocalDateTime.of(2014, 2, 4, 19, 51, 1).atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();

long secondsSinceUnixEpoch2 =
  LocalDate
    .of(2014, 2, 4)
    .atTime(19, 51, 1)
    .atZone(ZoneId.of("Europe/Oslo"))
    .toEpochSecond();

1
स्पष्टीकरण के लिए धन्यवाद। का उपयोग करके LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));और फिर सही परिणाम मिला Long epoch = time.atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();

1

मानव पठनीय तिथि से युगांतर में परिवर्तित करें :

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

युगांतर से मानव पठनीय तिथि में परिवर्तित करें :

String date = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").format(new java.util.Date (epoch*1000));

अन्य भाषा परिवर्तक के लिए: https://www.epochconverter.com


0

एक समय क्षेत्र का उपयोग किए बिना यह एक तरीका है:

LocalDateTime now = LocalDateTime.now();
long epoch = (now.getLong(ChronoField.EPOCH_DAY) * 86400000) + now.getLong(ChronoField.MILLI_OF_DAY);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.