2016-06-26 10 views
7

प्रस्तुत करता है मैं डेटाटाइम प्रबंधन के आसपास विभिन्न कोड का मिश्रण केवल जावा 8 java.time नामस्थान में साफ़ करने की कोशिश कर रहा हूं। अभी Instant के लिए डिफ़ॉल्ट DateTimeFormatter के साथ मेरा एक छोटा सा मुद्दा है। DateTimeFormatter.ISO_INSTANT फ़ॉर्मेटर केवल मिलीसेकंड दिखाता है जब वे शून्य के बराबर नहीं होते हैं।java.time.DateTimeFormatter: ISO_INSTANT की आवश्यकता है जो हमेशा मिलीसेकंड

युग 1970-01-01T00:00:00.000Z के बजाय 1970-01-01T00:00:00Z के रूप में प्रस्तुत किया गया है।

मैंने समस्या की व्याख्या करने के लिए एक इकाई परीक्षण किया और हमें एक दूसरे से तुलना करने के लिए अंतिम तिथियों की आवश्यकता कैसे है।

@Test 
public void java8Date() { 
    DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; 
    String epoch, almostEpoch, afterEpoch; 

    { // before epoch 
     java.time.Instant instant = java.time.Instant.ofEpochMilli(-1); 
     almostEpoch = formatter.format(instant); 
     assertEquals("1969-12-31T23:59:59.999Z", almostEpoch); 
    } 

    { // epoch 
     java.time.Instant instant = java.time.Instant.ofEpochMilli(0); 
     epoch = formatter.format(instant); 
     // This fails, I get 1970-01-01T00:00:00Z instead 
     assertEquals("1970-01-01T00:00:00.000Z", epoch); 
    } 

    { // after epoch 
     java.time.Instant instant = java.time.Instant.ofEpochMilli(1); 
     afterEpoch = formatter.format(instant); 
     assertEquals("1970-01-01T00:00:00.001Z", afterEpoch); 
    } 

    // The end game is to make sure this rule is respected (this is how we order things in dynamo): 
    assertTrue(epoch.compareTo(almostEpoch) > 0); 
    assertTrue(afterEpoch.compareTo(epoch) > 0); // <-- This assert would also fail if the second assert fails 

    { // to confirm we're not showing nanos 
     assertEquals("1970-01-01T00:00:00.000Z", formatter.format(Instant.EPOCH.plusNanos(1))); 
     assertEquals("1970-01-01T00:00:00.001Z", formatter.format(Instant.EPOCH.plusNanos(1000000))); 
    } 
} 
+3

डिफ़ॉल्ट प्रारूप केवल शून्य से अलग होने पर नैनोसेकंड प्रस्तुत करेगा। यदि आप हमेशा मिलीसेकंड (और कभी नैनोसेकंड नहीं) चाहते हैं, तो क्यों न केवल कस्टम फॉर्मेटर का उपयोग करें, जैसे 'डेटटाइमफॉर्मेटर फॉर्मेटर = डेटटाइमफॉर्मेटर.ओपटरर्न ("yyyy-MM-dd'T'HH: mm: ss.SSSX") .ZZone (ZoneId .of ("यूटीसी")); '? – mihi

+0

मैं 'त्वरित :: toString() 'के लिए उपयोग किए गए फ़ॉर्मेटर के जितना संभव हो उतना करीब रहना चाहता था। शायद मुझे वास्तव में एक स्ट्रिंग पैटर्न का उपयोग करना चाहिए था। – Florent

उत्तर

7

ठीक है, मैं स्रोत कोड को देखा और यह बहुत सीधा है:

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendInstant(3).toFormatter(); 

मुझे आशा है कि यह सब परिदृश्यों के लिए काम करता है, और यह किसी और कर सकते हैं। बेहतर/क्लीनर उत्तर जोड़ने में संकोच न करें।

बस समझाने के लिए यह जहां in the JDK's code, से आता है,

ISO_INSTANT इस तरह परिभाषित किया गया है:

public DateTimeFormatterBuilder appendInstant() { 
    appendInternal(new InstantPrinterParser(-2)); 
    return this; 
} 

और निर्माता InstantPrinterParser हस्ताक्षर है: के रूप में

public static final DateTimeFormatter ISO_INSTANT; 
static { 
    ISO_INSTANT = new DateTimeFormatterBuilder() 
      .parseCaseInsensitive() 
      .appendInstant() 
      .toFormatter(ResolverStyle.STRICT, null); 
} 

और DateTimeFormatterBuilder::appendInstant घोषित किया जाता है :

InstantPrinterParser(int fractionalDigits) 
+1

अच्छा होगा अगर आप जांच स्रोत कोड से जुड़े हों। –

+0

तो हम इसे केवल एमएस और नैनो – user1172490

+0

@ बेसिलबोरक में शामिल करने के लिए कैसे बदल सकते हैं। मैंने स्रोत कोड – Florent

0

accepted Answer by Florent सही और अच्छा है।

मैं बस कुछ स्पष्टीकरण जोड़ना चाहता हूं।

उल्लिखित फॉर्मेटर, DateTimeFormatter.ISO_INSTANT, केवल Instant कक्षा के लिए डिफ़ॉल्ट है। OffsetDateTime और ZonedDateTime जैसे अन्य वर्ग डिफ़ॉल्ट रूप से अन्य स्वरूपण का उपयोग कर सकते हैं।

जावा.टाइम कक्षाएं nanosecond तक एक संकल्प प्रदान करती हैं, milliseconds से अधिक बेहतर ग्रैन्युलरिटी। इसका अर्थ केवल 3 अंकों के बजाय दशमलव अंश में 9 अंकों तक है।

DateTimeFormatter.ISO_INSTANT का व्यवहार दशमलव अंश में अंकों की संख्या से भिन्न होता है। जैसा कि डॉक्टर कहते हैं (जोर मेरा):

प्रारूपण करते समय, दूसरा-मिनट हमेशा आउटपुट होता है। नैनो-ऑफ-सेकंड आवश्यकतानुसार शून्य, तीन, छः या नौ अंक आउटपुट करता है।

2011-12-03T10:

तो Instant वस्तु में निहित डेटा मूल्य के आधार पर, आप इन outputs के किसी भी देख सकते हैं 15: 30Z

2011-12-03T10 : 15: 30.100Z

2011-12-03T10: 15: 30।120Z

2011-12-03T10: 15: 30.123Z

2011-12-03T10: 15: 30.123400Z

2011-12-03T10: 15: 30.123456Z

2011-12 -03T10: 15: 30.123456780Z

2011-12-03T10: 15: 30.123456789Z

Instant वर्ग करने के लिए है जावा.टाइम का मूल भवन ब्लॉक। डेटा पासिंग, डेटा स्टोरेज और डेटा एक्सचेंज के लिए इसे अक्सर इस्तेमाल करें। उपयोगकर्ताओं को प्रस्तुति के लिए डेटा के स्ट्रिंग प्रस्तुतिकरण उत्पन्न करते समय, OffsetDateTime या ZonedDateTime का उपयोग करें।

संबंधित मुद्दे