2016-01-05 14 views
6

को बदलने के लिए Java8 से पहले, मैं Joda के DateTime वर्ग इस्तेमाल किया समयक्षेत्र जानकारी शामिल करने और मैं आसानी से DateTime और एसक्यूएल Timestamp के बीच कन्वर्ट करने के लिए कर सकते हैं।जावा 8 ZonedDateTime या OffsetDateTime Joda दिनांक समय

एक बार जावा 8 पर माइग्रेट करने के बाद, मुझे किस वर्ग को प्रतिस्थापित करना चाहिए? OffsetDateTime या ZonedDateTime?

इसके अलावा, मैंने OffsetDateTime का उपयोग करने का प्रयास किया, लेकिन ऐसा लगता है कि OffsetDateTime पर एक एसक्यूएल Timestamp से वापस नहीं बनाया जा सकता है।

Joda DateTime और Timestamp कनवर्टर के लिए, कोड की तरह है:

val joda = DateTime.now() 
val sqlJoda = new Timestamp(joda.getMillis) 
val jodaBack = new DateTime(sqlJoda) 

लेकिन Java8 के लिए,

val java8 = OffsetDateTime.now() 
val sqlJava8 = new Timestamp(java8.toInstant.toEpochMilli) 
val java8Back = ??? 

किसी को भी इस बारे में कुछ विचार है? ऐसा लगता है कि जोडा DateTime वास्तव में अच्छा है।

उत्तर

3

आप ZonedDateTime उपयोग कर सकते हैं। यहां कुछ नमूना कोड है जिसका उपयोग मैं Timestamp पर और आगे कनवर्ट करने के लिए करता हूं।

public ZonedDateTime from(Timestamp timestamp) { 
    if (timestamp == null) { 
     return null; 
    } 
    final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(timestamp.toInstant(), ZoneId.of("UTC")); 
    return zonedDateTime; 
} 

public Timestamp to(ZonedDateTime zonedDateTime) { 
    if (zonedDateTime == null) { 
     return null; 
    } 
    final Timestamp timestamp = Timestamp.valueOf(zonedDateTime.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime()); 
    return timestamp; 
} 

कृपया ध्यान दें कि मैं यूटीसी में डेटाबेस में दिनांक समय संग्रहीत करता हूं।

+1

एसक्यूएल टाइमस्टैम्प का आधिकारिक मैपिंग या तो लोकलडेटाइम (टाइम ज़ोन के बिना टाइमस्टैम्प) या ऑफसेटडेट टाइम (टाइमज़ोन के साथ टाइमस्टैम्प) है। उदाहरण के लिए यहां जेडीबीसी 4 जेसीपी का रखरखाव रिलीज 2 देखें: https://jcp.org/en/jsr/detail?id=221 – assylias

+0

उसे नहीं पता था। धन्यवाद। क्या वहां कोई डॉक्टर है? – spa

+0

यह भी देखें: http://stackoverflow.com/a/31749317/829571 – assylias

6

java.time में जावा 8 API का उपयोग करके आप निम्न कर सकता है:

long ms_since_epoch = 1_500_000_000_000L; 
Instant instant = Instant.ofEpochMilli(ms_since_epoch); 

// convert milliseconds in UTC to date 
OffsetDateTime dateUTC = OffsetDateTime.ofInstant(instant, ZoneOffset.UTC); 

अपने सम्मेलन का उपयोग करना:

val java8 = OffsetDateTime.now() 
val sqlJava8 = new Timestamp(java8.toInstant.toEpochMilli) 
val java8Back = OffsetDateTime.ofInstant(sqlJava8.toInstant(), ZoneOffset.UTC); 
+0

जिसका मतलब है हम यह मान डेटाबेस, यूटीसी है ना? धन्यवाद। – ttt

+2

हां। लेकिन आप इसे विभिन्न जोनआईडी का उपयोग करके अपने संबंधित समय क्षेत्र में बदल सकते हैं। –

2

मुझे लगता है कि आपका डेटाबेस प्रकार timestamp with time zone है। यदि यह timestamp without timezone है तो आपको एक अलग प्रकार/रूपांतरण तंत्र की आवश्यकता होगी।

JDBC 4.2 spec को OffsetDateTime पर मानचित्र करने की अनुशंसा करता है। यहां बताया गया है कि आप OffsetDateTime और java.sql.Timestamp के बीच कैसे परिवर्तित कर सकते हैं।

  • OffsetDateTime से Timestamp रहे हैं:

    Timestamp ts = ...; 
    OffsetDateTime odt = OffsetDateTime.ofInstant(ts.toInstant(), ZoneId.systemDefault()); 
    
  • Timestamp से OffsetDateTime रहे हैं:

    OffsetDateTime odt = ...; 
    Timestamp ts = Timestamp.from(odt.toInstant()); 
    
संबंधित मुद्दे