2017-10-16 10 views
7

कनवर्ट करते समय डेलाइट सेविंग त्रुटि के साथ मुझे एक ऐसी तारीख को परिवर्तित करने में समस्या आ रही है जो वास्तव में @DateTimeFormat एनोटेशन का उपयोग करके मौजूद नहीं है।@DateTimeFormat

उदाहरण के लिए, जब मैं अपने इकाई में तारीख 15/10/2017, एनोटेशन के साथ सेट किया जा रहा है इस प्रकार है:

@Column(nullable = false) 
@NotNull 
@DateTimeFormat(pattern = "dd/MM/yyyy") 
private Date dataVisita; 

मैं त्रुटि प्राप्त:

Failed To Convert Property Value Of Type Java.Lang.String To Required Type Java.Util.Date For Property DataVisita; 
Nested Exception Is Org.Springframework.Core.Convert.ConversionFailedException: 
    Failed To Convert From Type Java.Lang.String To Type @Javax.Persistence.Column @Javax.Validation.Constraints.NotNull @Org.Springframework.Format.Annotation.DateTimeFormat Java.Util.Date For Value 15/10/2017; 
Nested Exception Is Java.Lang.IllegalArgumentException: 
    Cannot Parse "15/10/2017": Illegal Instant Due To Time Zone Offset Transition (America/Sao_Paulo) 

मैं समझता हूँ कि त्रुटि मुझे बताती है कि 15/10/2017 00:00:00 दिनांक वास्तव में मौजूद नहीं है, लेकिन मैं 15/10/2017 01:00:00 में कनवर्ट करना चाहता हूं, इस समस्या को अनदेखा कर रहा हूं और संवाददाता दिनांक ढूंढ रहा हूं।

क्या @DateTimeFormat एनोटेशन को ओवरराइड करने के लिए कोई तरीका है या फ़ॉर्मेटर को लेंसेंट को इंगित करने का एक तरीका है?

+1

'मतलब जो आप कहते हैं और कहें कि आपका क्या मतलब है' आप वर्तमान में किसी ऑब्जेक्ट में दिनांक डालने का प्रयास कर रहे हैं जो दिनांक और समय का प्रतिनिधित्व करता है। क्या आप लोकलडेट का उपयोग कर सकते हैं या आप डेट के साथ फंस गए हैं? – mpkorstanje

+0

आप कस्टम deserializer बना सकते हैं। AFAIR यह हूड के तहत जैक्सन का उपयोग करता है। 'जेसन डीसेरियलाइज' एनोटेशन मदद करनी चाहिए। [जैक्सन-Deserialization उदाहरण।] (Http://www.baeldung.com/jackson-deserialization) –

+0

'@DateTimeFormat (iso = ISO.DATE_TIME) 'का उपयोग करने का प्रयास करें, यह –

उत्तर

3

इस प्रयास करें:

@Column(nullable = false)

@NotNull

@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm:ss")

private Date dataVisita;

यह है कि तुम क्या (1:00 करने के लिए 0:00 समायोजित), तो आपको इस प्रकार एक validator लागू करने के लिए की आवश्यकता होगी चाहते हैं लगता है:

public class PersonValidator implements Validator { 

    /** 
    * This Validator validates *just* Person instances 
    */ 
    public boolean supports(Class clazz) { 
     return Date.class.equals(clazz); 
    } 

    public void validate(Object obj, Errors e) { 
     String dateString = (String) obj; 
     DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); 
     DateTime ourDate = null; 
     try { 
      fmt.parseDateTime(dateString); 
     } catch (IllegalArgumentException e) { 
      // massage your hour here 
     } finally { 
      ourDate = fmt.parseDateTime(dateString); 
     } 
    } 
} 
+0

स्ट्रिंग में समय को अनदेखा नहीं करेगा, @ OleV.V. – hd1

0

यदि आप DateTimeFormat का उपयोग करना चाहते हैं जो जावा 8 क्लास है और नया हिस्सा है (अच्छी तरह से जावा 8) "जावा.टाइम" फ्रेमवर्क आपको शायद जावा 8 डेट क्लास का उपयोग करने की आवश्यकता है:

दिनांक:,210 java.time.LocalDate

समय:
java.time.LocalTime, java.time.OffsetTime

टाइमस्टैम्प:
java.time.Instant, java.time.LocalDateTime, java.time। ऑफसेटडेट टाइम और java.time.ZonedDateTime

इसके अलावा, आप अपने स्प्रिंग ढांचे के साथ किस ओआरएम का उपयोग कर रहे हैं? वसंत डेटा, हाइबरनेट या कुछ और? आप हाइबरनेट उपयोग करते हैं, तो हाइबरनेट उपयोगकर्ता की गाइड देखें: Mapping Date/Time Values

0

कैसे आप DB में अपनी तिथियाँ स्टोर पर निर्भर करता है, और अपने सर्वर समय क्षेत्र, समाधान, स्प्रिंग initialisation पर यूटीसी करने के लिए अपने डिफ़ॉल्ट समय क्षेत्र स्थापित करने के लिए उपयोग कर रहा होगा निम्नलिखित कोड:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

1

मेरे लिए, आप इस प्रणाली के स्थान के साथ सीधे गंदगी नहीं करना चाहिए। आपकी समस्या वास्तव में क्या है।

मेरा मतलब है कि आपने समय क्षेत्र प्रदान नहीं किया है, इसलिए आप सर्वर में से किसी एक का उपयोग कर रहे हैं। इस सर्वर पर इसकी कॉन्फ़िगरेशन के साथ, यह दिन/तारीख होगी। दूसरे सर्वर पर यह एक और दिन/तारीख होगी।

सुनिश्चित करें कि आप या तो यूटीसी (इसलिए कोई दिन प्रकाश बचत और सभी) या एक स्पष्ट लोकेल में काम करते हैं जो ग्राहक इनपुट में प्रदान करते हैं, स्टोर करने के लिए स्थानीय तारीख का उपयोग करें ... या तो इसे इस तरह रखें और जब आपको आवश्यकता हो तिथियों की तुलना करने के लिए, इसे यूटीसी में परिवर्तित करें। इस तरह से मुद्दा असंतोष होगा।

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

+0

मेरे पास "pt_BR" एप्लिकेशन के लिए एक डिफ़ॉल्ट कॉन्फ़िगर किया गया लोकेल है, इसलिए यह हमेशा तिथियों के लिए इसका उपयोग करेगा – Thiesen

0

यह वास्तव में सरल होना चाहिए।

यहां मुद्दा यह है कि आप डेट ऑब्जेक्ट के लिए स्ट्रिंग मान पास कर रहे हैं।

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/format/annotation/DateTimeFormat.html

आप यहाँ प्रकार डाल रहे हैं के लिए आवश्यक: java.util.Date, java.util.Calendar, java.lang.Long, Joda समय मूल्य प्रकार यहाँ प्रश्न में टिप्पणी के लिए प्रलेखन है

एक बहुत भोली रास्ता:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
Date destnationDateToBeSaved = sdf.parse("15/10/2017"); 

अनुशंसित तरीका:

उपयोग:

@DateTimeFormat(iso = ISO.DATE_TIME) 
private ZonedDateTime zonedDateTime; 

और

// 'yyyy-MMM-dd HH:mm:ss' pattern or if preferred ISO 
ZonedDateTime destnationDateToBeSaved= ZonedDateTime.parse("2017-Oct-15 23:35:05", DateTimeFormatter.ofPattern("yyyy-MMM-dd HH:mm:ss").withZone(ZoneId.of("UTC"))); 

आशा है कि मदद करता है!

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