字符串到日期格式,反之亦然

String to date format and vice versa

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

我遇到错误 Unparseable date: "20211109"

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

鉴于 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 V.V。在他的评论中建议,您不应该使用 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);

java.time

我强烈建议您使用 java.time,现代 Java 日期和时间 API,作为您的约会工作。

将一种格式的字符串日期转换为另一种格式的字符串通常需要两个格式化程序:一个用于描述您获得的格式,一个用于描述所需的格式。在这种情况下,前者是内置的。对于您需要的结果,静态定义一个格式化程序:

private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
                .withLocale(Locale.forLanguageTag("es-PA"));

该做的:

    String dateFormat = "20211109";
    LocalDate start = LocalDate.parse(dateFormat, DateTimeFormatter.BASIC_ISO_DATE);
    String string = start.format(DATE_FORMATTER);
    System.out.println(string);

输出:

11/09/2021

为了格式化,我采用了巴拿马内置的中等日期格式,因为这是格式符合您要求的语言环境之一。您当然应该使用用户的区域设置,而不是巴拿马的区域设置,以获得他们将识别为自己的输出格式。这样我们就省去了编写格式模式字符串的麻烦,同时代码本身也非常适合国际化。

您不应该希望从一种字符串格式转换为另一种字符串格式

如果您问的是如何将日期从一种字符串格式转换为另一种字符串格式,那您就问错了问题。除了最小的一次性程序,我们不应该将日期作为字符串处理,而是始终将它们存储在 LocalDate 个对象中。当我们接受字符串输入时,我们进行解析。只有当我们需要给字符串输出的时候,我们才格式化回来。

使用格式模式

如果出于某种原因您的用户对 Java 的本地化格式不满意,并且您需要对输出格式进行更多控制,您可以使用您在问题中尝试过的格式模式:

private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.ROOT);

链接