gpt4 book ai didi

java - Scala/java 对超过 31 天或低于 1 天的月份进行 sanitizer ?

转载 作者:行者123 更新时间:2023-11-29 05:56:56 26 4
gpt4 key购买 nike

使用 JodaTime 库(虽然我有点灵活)。我意识到一些输入打破了 Joda 时间,因为一个月中的天数高于 31 或低于 1(因为客户端代码)。

我正在使用 LocalDate 对象进行日历操作。是否有库或方法可以轻松清理日期,以便输入不会开始引发异常?

我现在使用的一些 Scala 代码:编辑:固定代码

 val now = new LocalDate();
val workingDate = now.withYear(y).withMonthOfYear(m).withDayOfMonth(d).withDayOfWeek(DateTimeConstants.SUNDAY)

ymdStart = toTimestampAtStart( workingDate )

为了澄清,这里的目标是将日期转换为正确的日期,因此如果用户提交了 7 月 38 日,它将转换为 8 月 7 日。传入的 URL 结构导致了很多这样的情况,它看起来像 /timeline/2012/07/30.

出于纯粹练习的原因(我同意规范化似乎是不好的做法)我现在只是好奇是否有处理此类问题的库。

谢谢!

最终更新:

正如答案所指出的那样,规范化是个糟糕的主意。我在客户端做了很多重构来修复传入的变量。这是我最终使用的代码:

ymdStart = new Timestamp( toTimestampAtStart( new LocalDate(y,m,d).withDayOfWeek(1) ).getTime - 86400000 )
ymdEnd = new Timestamp( ymdStart.getTime + 691200000 )

最佳答案

首先,LocalDate 是不可变的,因此每个链式 with...() 都会创建一个新日期。

其次,一次更新一个日期片段是一种众所周知的反模式。最终结果将取决于日期的当前值、更新片段的顺序以及实现是否“规范化”日期。

换句话说,从不零碎地更新日期/时间。

假设实现“规范化”(即纠正溢出)无效日期一分钟。根据您的代码,如果今天的日期是 2011 年 1 月 31 日,而您做了

now.setMonth(FEBRUARY);
now.setDayOfMonth(12);

结果将是 2011 年 3 月 12 日。第一条语句将日期设置为 2 月 31 日,然后标准化为 3 月 3 日,然后日期设置为 12。啊,你说,你可以先设置月份中的第几天。但这不适用于不同的起点(起点的构造留作练习)。

根据您的问题,我推测 JodaTime 抛出异常而不是规范化,这是不这样做的另一个原因。

关于java - Scala/java 对超过 31 天或低于 1 天的月份进行 sanitizer ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11732430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com