【发布时间】:2020-05-15 07:12:03
【问题描述】:
朋友们,我在尝试将行为从日历迁移到本地日期时遇到了麻烦。
payDate.set(Calendar.DAY_OF_MONTH,payDay)
让我们假设payDate 的当前日期为 2020-01-29
由于业务原因payDay可以有0的值,所以,当前面的代码行用前面的场景执行时,结果是payDate更新日期为2019-12-31,
也就是上个月最后一天的日期。
我不确定这是什么技术原因,如果有人能向我解释一下,我将非常感激,我尝试检查 java 文档,但没有帮助。
所以我需要使用 LocalDate java 库复制该行为。在我看来,我的观点是; Calendar 中的 set 方法与 LocalDate 中 DAY_OF_MONTH 的值的相似之处是:
payDate.withDayOfMonth(payDay)
但是当出现以下场景并且payDay 等于0 时,我得到一个错误:
java.time.DateTimeException: Invalid value for DayOfMonth (valid values 1 - 28/31): 0
我也有一些想法,关于如何在规则生效时在 localDate 中获得相同的日历结果(如果 payDay 为 0,则返回上个月的最后一天),但过于冗长。
如果您知道 LocalDate 上的类似行为,请帮助我。谢谢。
【问题讨论】:
-
当您使用
withDayOfMonth时,您的意思是“取25/12/2020并用我给您的值替换_/12/2020”。没有 12 月的零日或任何月份。如果您有一些零索引的值,则向其添加 1。 -
基本上,
CalendarAPI 显然很奇怪——文档解释得很详细,但java.timeAPI 更明智......你在使用时逃脱了这么奇怪的事情Calendar不起作用。如果您希望“0”表示“月初的前一天”,我建议您为此编写代码 - 检查payDay是否为 0,如果是,请使用withDayOfMonth(1).plusDays(-1) -
@JonSkeet
LocalDate有一个minusDays方法。您决定添加否定词有什么原因吗? -
@Michael:不特别。
minusDays(1)也适合我。 (这可能只是野田时间的偏见,我们只有PlusDays。) -
@DavidConrad:我们可能会同意不同意。它需要如此多的文档这一事实表明它太复杂了,IMO。 (延迟评估之类的东西也无济于事。)我不会说 C API 是一个很好的例子——我完全同意
Date设计师可能受到它的影响,我只是希望他们没有没有。
标签: java java-time localdate java-calendar