1

使用 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 )
4

1 回答 1

3

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

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

换句话说,永远不要更新日期/时间。

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

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

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

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

于 2012-07-31T02:58:02.747 回答