首页 > 解决方案 > 字符串到日期格式,反之亦然

问题描述

String dateFormat = "20211109";
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date  strtDt = sdf.parse(dateFormat);
String strt = sdf.format(strtDt);

我收到一个错误Unparseable date: "20211109"

如何将日期转换为给定格式并解析?

标签: javaspring-bootdate-formattingdate-parsing

解决方案


给定的格式,您使用了错误的输入SimpleDateFormat,它应该是格式11/09/2021(注意月份在一天之前):

String dateFormat = "11/09/2021";
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date  strtDt = sdf.parse(dateFormat);
String strt = sdf.format(strtDt);

否则,您可以在构造时更改日期模式SimpleDateFormat

String dateFormat = "20211109";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date  strtDt = sdf.parse(dateFormat);
String strt = sdf.format(strtDt);

编辑

您可以使用正则表达式模式匹配根据您输入的格式化字符串在格式化程序之间切换:

Pattern pattern = Pattern.compile("^\\d{8}$");
SimpleDateFormat sdf;
if (pattern.matcher(input).matches()) {
    sdf = new SimpleDateFormat("yyyyMMdd");
} else {
    sdf = new SimpleDateFormat("MM/dd/yyyy");
}
Date  strtDt = sdf.parse(input);
String strt = sdf.format(strtDt);

您也可以捕获ParseException以尝试另一种格式解析,但我不建议您对程序流使用异常。

正如@Ole VV 在他的评论中所建议的那样,您不应该使用java.text.SimplateDateFormatjava.util.Date类进行日期类型操作和解析,因为它们已经过时并且可能会在此过程中造成很多麻烦。

如果您使用的是 JDK 1.8 及更高版本,则应使用JSR 310中引入的新日期时间API :

String dateFormat = "20211109";
DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE;
// Same as `DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");`
LocalDateTime  strtDt = formatter.parse(dateFormat, LocalDateTime::from);
String strt = formatter.format(strtDt);

推荐阅读