2016-12-06 44 views
1

我正在使用Java 8日期和时间实用程序。我正在使用TemporalAdjuster界面和TemporalAdjusters中的实现来操纵特定日期或日期的计算。如何自定义Java 8中的TemporalAdjusters?

我的要求是计算3个月和2天后的一天。 例如,今天是12月6日(即2016-12-06在YYYY-MM-DD),3个月和2天后,日期为2017年3月8日(即2017年3月8日至年月日 - MM-DD)。

我试着这样做使用日期和时间效用如下两种方式:

//First 
LocalDate dayAfter3MonthsAnd2Days = LocalDate 
    .now() 
    .with(firstDayOfNextMonth()).plusMonths(2).plusDays(2); 

//Second 
LocalDate dayAfter3MonthsAnd2Days = LocalDate 
    .now() 
    .with(firstDayOfMonth()).plusMonths(3).plusDays(2); 

他们两个返回的日期在3月,2017年(即2017年3月3日),如下所示的3:

dayAfter3MonthsAnd2Days = 2017年3月3日

有没有什么办法可以自定义TemporalAdjusters并获得所需的输出?或者其他任何替代方案来实现目标?

回答

2

我发现我可以简单地使用以下命令:

LocalDate dayAfter3MonthsAnd2DaysNew = LocalDate 
              .now() 
              .plusMonths(3) 
              .plusDays(2); 

非常久远的是,我还可以用它采用上述相同的过程中做的操作如下定制TemporalAdjuster:

TemporalAdjuster ta = TemporalAdjusters.ofDateAdjuster(
             (LocalDate d) -> d.plusMonths(3).plusDays(2)); 

LocalDate dayAfter3MonthsAnd2DaysCustom = LocalDate 
               .now() 
               .with(ta); 

虽然以前的方法比较简单,但我们可以使用更多的使用TemporalAdjuster的DateAdjuster方法的自定义程序。

+2

是的,定制现有的调节器是不可能的。这只是一种正式的方式来编写一些帮手代码。所以结论是:没有定制,而是写一个新的调节器。在你的答案中完成真正的实现是你的任务。 –

+1

好问答,内容翔实。顺便说一句:最好将'ZoneId'明确传递给'now'方法,而不是隐式地依赖JVM的当前默认时区,该时区可能在运行时随时改变。例如:'LocalDate.now(ZoneId.of(“America/Montreal”))' –

相关问题