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

标签 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 结构导致了很多这样的情况,它看起来像 /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/

相关文章:

java - 为什么我的更新不起作用?

scala - 我如何从 finagle 客户端发出带有参数的请求?

java - 使用 Joda-Time 计算持续时间

java - 如何在hibernate和spring中生成这种格式的订单号ORD000001

java - 在 Java 中使用 HashMap 打印出重复的字符串

java - 在 IntelliJ Idea 中从 Java 调用 Clojure?

java - 了解 JodaTime DateTime.parse(string, formatter)

scala - Function.tupled 和占位符语法

scala - scala 中映射的按键聚合/归约函数

java - Joda 日期时间 格式无效