java स्प्रिंग बूट जैक्सन की तारीख और टाइमस्टैम्प प्रारूप



spring-boot date (1)

सबसे पहले Date.toString विधि भ्रामक आउटपुट उत्पन्न करती है और हमें इस पर भरोसा नहीं करना चाहिए। सरल उदाहरण:

SimpleDateFormat dateToStringFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", new Locale("us"));
Date parsed = dateToStringFormat.parse("Wed Mar 20 09:00:00 KST 2019");
System.out.println("Default toString: " + parsed);

dateToStringFormat.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));
System.out.println("With 'Asia/Seoul' TZ: " + dateToStringFormat.format(parsed));

dateToStringFormat.setTimeZone(TimeZone.getTimeZone("Chile/Continental"));
System.out.println("With 'Chile/Continental' TZ: " + dateToStringFormat.format(parsed));

प्रिंट:

Default toString: Wed Mar 20 01:00:00 CET 2019
With 'Asia/Seoul' TZ: Wed Mar 20 09:00:00 +0900 2019
With 'Chile/Continental' TZ: Tue Mar 19 21:00:00 -0300 2019

जैसा कि आप देख सकते हैं कि मैंने आपका उदाहरण दिनांक Wed Mar 20 09:00:00 KST 2019 को प्रिंट किया है और toString विधि का उपयोग कर प्रिंट किया है और दो अलग-अलग टाइमज़ोन के साथ प्रारूपित किया है। इसलिए, हर कोई तारीख को अपने समयक्षेत्र के साथ जोड़कर देखता है। पर और अधिक पढ़ें:

हम आपके द्वारा प्रस्तावित कॉन्फ़िगरेशन में दिनांक पेटेंट को परिभाषित नहीं कर सकते हैं। यहां उपलब्ध Jackson विन्यास विकल्प देखें।

आप com.fasterxml.jackson.annotation.JsonFormat एनोटेशन का उपयोग करके प्रारूप को कॉन्फ़िगर कर सकते हैं। चूंकि Java 8 उपलब्ध है, हमें java.time.* उपयोग करना चाहिए java.time.* समय से संबंधित गुणों के लिए कक्षाएं। उदाहरण POJO वर्ग इसे पसंद कर सकता है:

import com.fasterxml.jackson.annotation.JsonFormat;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.MonthDay;

public class RequestPayload {

    @JsonFormat(pattern = "MM/dd")
    private MonthDay md;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dateTime;

    // getters, setters, toString
}

यह काम करने के लिए हमें JavaTimeModule मॉड्यूल को पंजीकृत JavaTimeModule :

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.modules(new JavaTimeModule());

    return builder;
}

यदि आप अपने Bean गुणों को java.time.* बदल सकते हैं java.time.* कक्षाएं सिर्फ Controller लेकर DB तक इन तिथियों का प्रचार करती हैं। अन्य मामले में इस प्रश्न को देखें: java.time.ocalDateTime और java.util.Date के बीच परिवर्तित

application.yml कॉन्फ़िगरेशन:

jackson:
    date-format: yyyy-MM-dd
    timestamp-format:yyyy-MM-dd HH:mm:ss
    serialization:
      write-dates-as-timestamps: false

बीन गुण:

@Entity 
@Column(nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Temporal(TemporalType.DATE)
private Date date_created;

@Column(nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Temporal(TemporalType.TIMESTAMP)
private Date reg_date;

मैं सभी Date फ़ील्ड्स को java.util.Date रूप में सेट करता हूं। वे प्रकार जो प्रारूप yyyy-MM-dd और टाइमस्टैम्प प्रकार ( yyyy-MM-dd HH:mm:ss ) में अनुरोध परम शैली ( yyyy-MM-dd या yyyy-MM-dd HH:mm:ss ) के अनुसार प्राप्त करते हैं yyyy-MM-dd HH:mm:ss )

timestamp का उपयोग करने के लिए, मुझे @Temporal ( TemporalType.Date or Timestamp ) मिला, जो DB Type द्वारा मैपिंग है।

दिनांक और टाइमस्टैम्प प्रारूप को सही तरह से संग्रहीत किया जाता है जैसे कि yyyy-MM-dd या yyyy-MM-dd HH:mm:ss.sss

RestController वर्ग:

@PostMapping("/")
public ResponseEntity<Object> create(@RequestBody CreateVO createVO, HttpServletRequest request) {
    System.out.println("planned_date> "+createVO.getDate_planned_start());
    System.out.println("regdate> "+createVO.getReg_date());    
}

इसके लिए तैयार हैं:

planned_date> Wed Mar 20 09:00:00 KST 2019 // Date Result
regdate> Mon Oct 01 16:45:00 KST 2012 //Timestamp Result

हालाँकि, मुझे अपेक्षा से अलग प्रारूप में RestController Date प्राप्त होती है।

क्या yyyy-MM-dd और yyyy-MM-dd HH:mm:ss in Controller प्राप्त करने के लिए कोई समाधान है?

मैं application.yml सेटिंग्स के बारे में भी सोच रहा हूं। क्योंकि मुझे यकीन नहीं है कि टाइमस्टैम्प-प्रारूप कैसे सेट किया जाए।





format