首页 > 解决方案 > 格式不正确的 Java 日期处理

问题描述

首先,我是一名学习 Java 的 C# 开发人员。我正在转换我用 C# 编写的程序作为练习,并且在解析从 html 表单提交的日期时遇到问题。表单作为电子邮件发送,java 程序读取电子邮件并解析正文。我有一个下拉日历供我的窥视者从中选择一个日期,但总是有一些混蛋必须输入它并将所有内容都搞砸。目前我在我的代码中这样做:

public void SetDatePlayed(String datePlayed)
{
    this.datePlayed = LocalDate.parse(datePlayed);
}

传入的 datePlayed 是一个通常格式为 yyyy-MM-dd 的字符串,但当然有人输入了 3/7 而不是使用表单上的日历下拉菜单。this.datePlayed 是一个本地日期。在 C# 中,我最终会得到一个假设为 2020 年的日期——没问题。LocalDate 真的希望它采用 yyyy-MM-dd 格式,我不知道 Java 的最佳实践是什么。我整个早上都在谷歌上搜索它,并没有发现这对其他人来说是个问题。我不在乎我是否在使用 LocalDate,但我确实需要它是一个日期数据类型,以便我以后可以进行日期检查、排序、搜索等。

标签: java

解决方案


您可以使用DateTimeFormatterBuilderparseDefaulting()提供年份的默认值。

基于Sweeper 的答案,可以这样做:

static LocalDate parseLoosely(String text) {
    DateTimeFormatter fmt = new DateTimeFormatterBuilder()
            .appendPattern("[uuuu-M-d][M/d/uuuu][M/d]")
            .parseDefaulting(ChronoField.YEAR, Year.now().getValue())
            .toFormatter();
    return LocalDate.parse(text, fmt);
}

警告:不要将格式化程序缓存在例如static字段中,因为它会快照年份,如果程序可能在新年前夜运行,webapp 会这样做,除非您添加逻辑以使缓存在年份更改时自动刷新。

测试

System.out.println(parseLoosely("2019-04-07"));
System.out.println(parseLoosely("2019-4-7"));
System.out.println(parseLoosely("4/7/2019"));
System.out.println(parseLoosely("4/7"));

输出

2019-04-07
2019-04-07
2019-04-07
2020-04-07

推荐阅读