使用 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/