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
的模式字段。所以这可能会有用。
我正在处理 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
的模式字段。所以这可能会有用。