java - Spring Boot Jackson 日期和时间戳格式

标签 java spring-boot date jackson format

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.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 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 .

关于java - Spring Boot Jackson 日期和时间戳格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55256567/

相关文章:

java - 在Java中不使用数组按长度排序字符串

java - 无限 while 循环以及读取文件时出现问题

Spring Webflux ErrorHandling - 带有@ExceptionHandler 或 DefaultErrorAttributes 的 @RestControllerAdvice?

java - 从 thymeleaf 到 spring boot 的对象列表

java - 将 sql.date 类型转换为日历

java - 插入后获取生成的id

Java 8 流 - 使用带有替代累加器返回类型的 reduce

java - Spring Controller 不支持ServerHttpRequest

python - 如何在给定日期的情况下获得星期几?

java - 如何从 JTable 中获取第一个小时