java - 格式不正确的 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,但我确实需要它是一个日期数据类型,以便我以后可以进行日期检查、排序、搜索等。
解决方案
您可以使用DateTimeFormatterBuilder
和parseDefaulting()
提供年份的默认值。
基于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
推荐阅读
- javascript - 如何过滤从当前日期到 90 天前的 createdAt?
- c# - 如何在 ASP.NET Core MVC Web 应用程序中收集 JWT 令牌
- reactjs - 如何在 Jest 测试文件中使用导入语句?
- python - 如何将 Telethon 与 Flask 一起使用?
- javascript - 将气泡图放在堆积面积图的顶部会导致缺少工具提示/标签和不需要的颜色继承
- javascript - JavaScript 字符串 normalize() 在某些情况下不起作用 - 为什么?
- kotlin - 由相同 ArrayList 填充的两个微调器
- javascript - 更改语义 UI Form.Select 元素的选定项目背景颜色
- wso2 - 从注销后 URL 中删除附加参数
- python - 信号再合成的重叠包络