【问题标题】:Spring Boot change date format of request param field as DTOSpring Boot将请求参数字段的日期格式更改为DTO
【发布时间】:2020-05-20 11:03:06
【问题描述】:

我的控制器有一个GET 端点,它接受许多查询参数。因此,我没有创建多个 @QueryParam,而是创建了一个 CriteriaDTO,以便对我们的 Mongo 数据库执行动态查询

我的控制器端点:

@GetMapping
public List<MyObject> getAll(@Valid CriteriaDTO criteriaDTO){
    return myObjectService.findAll(criteriaDTO);
} 

public class CriteriaDTO {

    private int offset = 0
    private int limit = 20
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate minDate

    // getters, setters ...
}

而且,我想传递的 minDate 是具有以下格式 yyyy-MM-dd 的 URL,但我需要将其转换为以下格式 yyyy-MM-dd'T'HH:mm:ss.SSS

我的问题是:是否有任何注释或其他东西可以接受第一种格式yyyy-MM-dd 并自动将其转换为另一种格式?

如果我拨打以下电话,请明确:

http://localhost:8080/api/myobject?minDate=2020-01-01

然后criteriaDTO.getminDate() 将返回2020-01-01'T'00:00:00.000

感谢您的帮助:)

【问题讨论】:

    标签: java spring-boot datetime dto localdate


    【解决方案1】:

    您可以通过比搜索注释魔术解决方案更简单的方式进行操作。

    只需在 CriteriaDTO 中添加一个用于 LocalDateTime 的额外 getter:

    public LocalDateTime getMinDateTime() {
        return this.minDate.atTime(0, 0, 0, 0);
    }
    

    并在需要时间而不是日期的任何地方使用它。

    【讨论】:

      【解决方案2】:

      使用 SimpleDateFormat 定义 setter 和解析

      public void setMinDate() {
          if(!minDate.empty()) {
              SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
              this.minDate = formatter.parse(minDate)
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        我建议使用atStartOfDay,而不是使用自定义解串器将此2020-01-01 转换为2020-01-01'T'00:00:00.000。而且由于您正在操作输入数据,我建议您将其作为单独的操作进行

        LocalDateTime date = criteriaDTO.getminDate().atStartOfDay()  //2020-01-01'T'00:00
        

        您还可以添加格式化程序DateTimeFormatter 以获得所需的输出

        date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) //2020-01-01'T'00:00:00
        

        【讨论】:

          【解决方案4】:

          您有多种选择。检查你到底需要什么,

              LocalDate date = LocalDate.now();
          
              LocalDateTime dateTime = LocalDateTime.of(date, LocalTime.MIDNIGHT);
              System.out.println(dateTime); //2020-02-04T00:00:00
          
              System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(dateTime)); //2020-02-04T00:00:00
          
              System.out.println(date.atStartOfDay()); ////2020-02-04T00:00
          
              DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
              System.out.println(formatter.format(dateTime)); //2020-02-04T00:00:00.000
          

          需要修改dto中的getter进行格式化,例如:

          class CriteriaDTO {
              DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
          
              private int offset = 0
              private int limit = 20
              @DateTimeFormat(pattern = "yyyy-MM-dd")
              private LocalDate minDate
          
              public String getMinDate() {
                  return formatter.format(LocalDateTime.of(minDate, LocalTime.MIDNIGHT));
              }
          
              // getters, setters ...
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-07-04
            • 2018-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-03
            相关资源
            最近更新 更多