2017-05-16 14 views
5

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

मेरे पास 2 गुण (initDate, endDate) के साथ एक डोमेन ऑब्जेक्ट है। मैं 2 कन्वर्टर्स MySQL DB

@Convert(converter = LocalDateTimeAttributeConverter.class) 
private LocalDateTime initDate; 

@Convert(converter = ZonedDateTimeAttributeConverter.class) 
private ZonedDateTime endDate; 

कनवर्टर 1 से निपटने के लिए बनाना चाहते हैं (ठीक है)

@Converter 
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> { 

    @Override 
    public Timestamp convertToDatabaseColumn(LocalDateTime localDateTime) { 
     return (localDateTime == null ? null : Timestamp.valueOf(localDateTime)); 
    } 

    @Override 
    public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) { 
     return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime()); 
    } 
} 

यह एक है कि मैं

@Converter 
public class ZonedDateTimeAttributeConverter implements AttributeConverter<ZonedDateTime, Timestamp> { 

    @Override 
    public Timestamp convertToDatabaseColumn(ZonedDateTime zoneDateTime) { 
     return (zoneDateTime == null ? null : Timestamp.valueOf(zoneDateTime)); 
    } 


    @Override 
    public ZonedDateTime convertToEntityAttribute(Timestamp sqlTimestamp) { 
     return (sqlTimestamp == null ? null : sqlTimestamp.toZonedDateTime()); 
    } 
} 

लेकिन मैं बनाना चाहते है ऐसा नहीं हो सकता क्योंकि मेरे पास 2 त्रुटियां हैं:

The method valueOf(String) in the type Timestamp is not applicable for the arguments (ZonedDateTime) 

और टाइमस्टैम्प विधि toZonedDateTime()

और अगर मैं ZonedDate के लिए किसी भी कनवर्टर नहीं जोड़ते हैं, जेपीए प्रकार varbinary(255)

+3

वैसे आप किस समय क्षेत्र में चाहते हैं? (यह 'टिमस्टैम्प' को 'लोकलडेटाइम' में परिवर्तित करने से काफी टूटा हुआ लगता है, लेकिन वहां हम जाते हैं।) आप 'Timestamp.toInstant()' और 'Timestamp.from (Instant) 'के माध्यम से जाना चाह सकते हैं। –

उत्तर

4

Timestamp नैनोसेकंद सटीकता प्रदान करने के लिए Date बढ़ाता है। न तो Date और न ही Timestamp को विशिष्ट समय क्षेत्र को ZoneDateTime के रूप में संदर्भित करने के लिए डिज़ाइन किया गया है।

यदि आपको ZonedDateTime ->Timestamp को परिवर्तित करने की आवश्यकता है तो आपको टाइमज़ोन/ऑफसेट जानकारी को त्यागना होगा। जैसे

LocalDateTime withoutTimezone = zoneDateTime.toLocalDateTime(); 
Timestamp timestamp = Timestamp.valueOf(withoutTimezone)); 

और Timestamp परिवर्तित करने के लिए ->ZonedDateTime आप निर्दिष्ट करने की आवश्यकता एक ऑफसेट:

LocalDateTime withoutTimezone = sqlTimestamp.toLocalDateTime(); 
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("+03:00")); 

या समय क्षेत्र:

ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("Europe/Paris")); 

आपका इरादा डेटाबेस में ZonedDateTime चर को बचाने के लिए है और वहां निर्दिष्ट विभिन्न टाइमज़ोन को संरक्षित करें, मैं तदनुसार आपके डेटाबेस को डिज़ाइन करने की अनुशंसा करता हूं। सुझाव:

  1. एक LocalDateTime और एक VARCHAR"Europe/Paris" या एक SMALLINT की तरह एक समय क्षेत्र बचत बचत मिनट में एक ऑफसेट को बचाने के लिए प्रकार DATETIME के एक स्तंभ का उपयोग करें।
  2. ZonedDateTime को String पर कनवर्ट करें और कॉलम "2017-05-16T14:12:48.983682+01:00[Europe/London]" पर सहेजें। डेटाबेस से पढ़ने के दौरान आपको इसे पार्स करना होगा।
+2

समय क्षेत्र जानकारी रखने के लिए डेटाबेस को डिजाइन करने के स्पष्ट रूप से अच्छे सुझाव के लिए उपरोक्त। –

5

जॉन स्कीट के साथ एक मेज बनाता है नहीं है यह पहले से ही कहा:

@Override 
public Timestamp convertToDatabaseColumn(ZonedDateTime zoneDateTime) { 
    return zoneDateTime == null ? null : Timestamp.from(zoneDateTime.toInstant()); 
} 

@Override 
public ZonedDateTime convertToEntityAttribute(Timestamp sqlTimestamp) { 
    return sqlTimestamp == null ? null : sqlTimestamp.toInstant().atZone(ZoneId.systemDefault()); 
} 

जॉन ने भी अच्छे प्रश्न से पूछा, आप किस समय क्षेत्र चाहते हैं? मैंने पर अनुमान लगाया है। जाहिर है कि एक अलग समय क्षेत्र एक अलग परिणाम देगा, इसलिए मुझे उम्मीद है कि आप दो बार सोचेंगे और आपके उद्देश्य के लिए सही समय क्षेत्र ढूंढ पाएंगे।

पीएस मैंने ब्रांड्स के उपयोग को कम कर दिया है क्योंकि मुझे इसे कम से कम पठनीय पाया गया है। यदि आप चाहें तो आप उन्हें वापस जोड़ सकते हैं।

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