Spring MVC:通过 REST 端点将字符串日期转换为日期

Spring MVC: Convert String Date into Date over REST endpoint

我正在处理 Spring 引导项目,我想转换来自 post 请求的字符串日期

D,100000001028686,BA0884,72087000000176,N,2,147568593,DEPOSITREFERENCE,2020-08-05 20:17:33.32691, 601123,ZAR,2500,57,24,i10c=0,i20c=2,i50c=5,iR1=2,iR2=5,iR5=8,iR10=200,iR20=1,iR50=55,iR100=60,iR200=82,0,0,0,0,000

我要转换的日期在 Bold 中,需要将该部分从 @PostMapping 方法请求参数转换为 java.time 之一对象。

搜索后,我找到了一些不使用 Spring 的数据解决方案,但它对我不起作用并使用了 java.util.Date,这里是我到目前为止编写的代码

    class Main {
      public static void main(String[] args) throws ParseException {
        String date = "2020-08-05 20:18:33.32692";
        System.out.println(covertDate(date)); //Wed Aug 05 20:19:05 UTC 2020
      }
    
       public static Date covertDate(String date) throws ParseException {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSS");
            return formatter.parse(date);
        }
    }

我得到的回复不是我想要的,请问有什么办法可以解决这个问题

这是我搜索future后找到的解决方案 我用Java8API来解决

 class Main {
  public static void main(String[] args) throws ParseException {
    String sDate6 = "2020-08-05 11:50:55.555";
    System.out.println(covertDate(sDate6)); //2020-08-05T11:50:55.555
  }

   public static LocalDateTime covertDate(String date) throws ParseException {
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS", Locale.ENGLISH);
         LocalDateTime dateTime = LocalDateTime.parse(date,formatter);
         return dateTime;  
    }
}

JShell (Java Version 14) 中,我 运行 你的代码并能够得到类似的结果(G运行ted 它是 GMT 而不是 UTC;但是,秒被抵消了与当前输出相同的数量):

如果问题是关于 UTC 的:

我建议使用 Instant as it avoids many of the issues that LocalDateTime 多年来提出的。如评论中所述,通常最好避免使用 java.util.Date 并改用 Instant(或者您可以使用更传统的 LocalDateTime)。

如果您正在谈论 Spring 的注释 @PostMapping 自动解析日期的方法,您可以使用类似的方法:

@PostMapping
public String postDate(@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Long dateReq) {
  Instant date = Instant.ofEpochMilli(dateReq);
  System.out.println(date);
}

如果您想使用自定义格式化程序,您可以将 @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSSSS" LocalDateTime date) 作为 postDate 方法的参数。

请注意 Spring 的文档指出 @DateTimeFormat uses the same patterns as java.text.SimpleDateFormat 的模式字段。所以这可能会有用。