Scala / java清理日期31或以下1的日期?

时间:2012-07-31 02:50:05

标签: java scala jodatime

使用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结构导致了很多这个,它看起来像{{ 1}}。

出于纯粹运动的原因(我同意标准化似乎是不好的做法)我现在只是好奇,如果有图书馆处理这样的问题。

谢谢!

最终更新:

就像答案所指出的那样,规范化是一个糟糕的主意。我在客户端进行了大量的重新分解以修复传入的变量。这是我最终使用的代码:

/timeline/2012/07/30

1 个答案:

答案 0 :(得分:3)

首先,LocalDate是 immutable ,因此每个链接with...()正在创建一个新日期。

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

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

假设一分钟实施“规范化”(即纠正溢出)无效日期。鉴于您的代码,如果今天的日期是2011年1月31日,那么您确实

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

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

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