使用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
答案 0 :(得分:3)
首先,LocalDate是 immutable ,因此每个链接with...()
正在创建一个新日期。
其次,一次更新一个日期的片段是一个众所周知的反模式。最终结果将取决于日期的当前值,更新片段的顺序以及实现是否“规范化”日期。
换句话说 从不 更新日期/时间零碎。
假设一分钟实施“规范化”(即纠正溢出)无效日期。鉴于您的代码,如果今天的日期是2011年1月31日,那么您确实
now.setMonth(FEBRUARY);
now.setDayOfMonth(12);
结果将是2011年3月12日。第一个语句将日期设置为31 - 2月,将其标准化为03 - 3月,然后将日期设置为12.啊,你说,你可以先设置日期。但这不适用于不同的起点(其结构留作练习)。
从你的问题我推测JodaTime抛出异常而不是规范化,这是不这样做的另一个原因。