Spring Boot Jackson日期和时间戳格式 [英] Spring Boot Jackson date and timestamp Format

查看:2117
本文介绍了Spring Boot Jackson日期和时间戳格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

application.yml配置:

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

Bean属性:

@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-ddyyyy-MM-dd HH:mm:ss)

I set all Date fields as java.util.Date type which receive date in format yyyy-MM-dd and timestamp type(yyyy-MM-dd HH:mm:ss) according to request param style(yyyy-MM-dd or yyyy-MM-dd HH:mm:ss)

使用timestamp时,我发现了@Temporal(TemporalType.DateTimestamp),它是由DB Type映射的.

For using timestamp, I found the @Temporal(TemporalType.Date or Timestamp) which is mapping by DB Type.

日期和时间戳格式正确存储为yyyy-MM-ddyyyy-MM-dd HH:mm:ss.sss

Date and timestamp format is stored correctly like yyyy-MM-dd or 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中收到的格式与我预期的格式不同.

However, I receive in RestController Date in different format than i expected.

有什么解决方法可以在Controller中接收yyyy-MM-ddyyyy-MM-dd HH:mm:ss吗?

Is there any solution to receive yyyy-MM-dd and yyyy-MM-dd HH:mm:ss in Controller?

我也想知道application.yml设置.因为我不确定如何设置时间戳格式.

I am wondering about application.yml settings as well. Because I am not sure how to set timestamp-format.

推荐答案

首先,Date.toString方法会产生误导性的输出,我们不应该依赖它.简单的例子:

First of all Date.toString method generates misleading output and we should not rely on it. Simple example:

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方法进行打印,并使用两个不同的时区进行了格式设置.因此,每个人都看到日期和他的时区.阅读有关以下内容的更多信息:

As you can see I parsed your example date Wed Mar 20 09:00:00 KST 2019 and print using toString method and formatted with two different timezones. So, everyone sees date combined with his timezone. Read more about:

  • Java Date toString contains a timezone… Why?
  • Parsing a java Date back from toString()

我们无法像您建议的那样在配置中定义日期模式.查看可用的

We can not define date patters in configuration like you proposed. See available Jackson configuration options here.

您可以使用com.fasterxml.jackson.annotation.JsonFormat注释配置格式.由于Java 8可用,因此我们应该将java.time.*类用于与时间相关的属性.示例POJO类可能是这样的:

You can configure format using com.fasterxml.jackson.annotation.JsonFormat annotation. Since Java 8 is available we should use java.time.* classes for time related properties. Example POJO class could like this:

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 模块:

To make it work we need to register JavaTimeModule module:

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

    return builder;
}

如果可以将Bean属性更改为java.time.*类,只需将这些日期从Controller传播到DB.在其他情况下,请参见以下问题:在java.time.LocalDateTime之间进行转换和java.util.Date .

If you can change your Bean properties to java.time.* classes just propagate these dates from Controller to DB. In other case see this question: Converting between java.time.LocalDateTime and java.util.Date.

这篇关于Spring Boot Jackson日期和时间戳格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆