Spring Boot Jackson 日期和时间戳格式

Posted

技术标签:

【中文标题】Spring Boot Jackson 日期和时间戳格式【英文标题】:Spring Boot Jackson date and timestamp Format 【发布时间】:2019-08-10 21:35:00 【问题描述】:

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

为了使用timestamp,我找到了@Temporal(TemporalType.Date or Timestamp),它是由DB Type映射的。

日期和时间戳格式正确存储,如yyyy-MM-ddyyyy-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 中收到的格式与我预期的不同。

有没有办法在Controller接收yyyy-MM-ddyyyy-MM-dd HH:mm:ss

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

【问题讨论】:

您是否希望实体中的Date 和/或从getDate_planned_startgetReg_date 返回的Date 具有您指定的格式?这是不可能的。 Date 不能有格式。此外,您不应该使用 Date 类。它设计得很糟糕,而且已经过时了。你不想从java.time, the modern Java date and time API 和jackson-modules-java8 获得LocalDateLocalDateTime 吗? display Java.util.Date in a specific format 和/或 want current date and time in “dd/MM/yyyy HH:mm:ss.SS” format 的可能重复 【参考方案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 方法打印并使用两个不同的时区格式化。因此,每个人都会看到日期与他的时区相结合。阅读更多:

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

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

您可以使用com.fasterxml.jackson.annotation.JsonFormat 注解配置格式。由于Java 8 可用,我们应该将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模块:

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

    return builder;

如果您可以将Bean 属性更改为java.time.* 类,只需将这些日期从Controller 传播到DB。在其他情况下,请参阅此问题:Converting between java.time.LocalDateTime and java.util.Date。

【讨论】:

感谢您的回答,但我不想使用 @JsonFormat 或将字段从 Date 更改为 LocalDate 我正在寻找 Jackson 配置接收的解决方案 (yyyy-MM-dd (request)> yyyy -MM-dd 或 yyyy-MM-dd HH:mm:ss (request) > yyyy-MM-dd HH:mm:ss) 通过应用程序中的配置 .yml ..! @SarahSon,恐怕不能接受很多日期格式。您应该选择最长的一个,如果您想发送时间,只需设置零。您可以使用builder.dateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); 配置Jackson2ObjectMapperBuilder 没有选项允许从application.yml 等配置文件中为Jackson 设置日期格式。

以上是关于Spring Boot Jackson 日期和时间戳格式的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot - Jackson 日期序列化和反序列化

Spring boot + Jackson - 始终将日期转换为 UTC

Spring boot + Jackson + LocalDateTime:日期解析不正确

Jackson 在 Spring Boot Rest 应用程序中将日期更改为一天。

spring-boot:对日期(Date)类型数据的序列化

spring-boot:对日期(Date)类型数据的序列化