gpt4 book ai didi

java - 如何在 Joda-Time 中总结岁月

转载 作者:行者123 更新时间:2023-11-29 04:38:47 27 4
gpt4 key购买 nike

Joda-Time中是否有现成的方式?总结年?

假设您有一个 DateTime startDate = 10-18-2016 和一个 DateTime endDate = 12-18-2017。我希望这可以四舍五入到 2 年。

目前,当我这样做时:

Years yearsBetween = Years.yearsBetween(startDate, endDate);

我得到 yearsBetween = 1。是否有使用 Joda Time 解决此问题的简单方法,或者我是否需要编写自定义方法来处理此问题?

最佳答案

tl;dr

  • 将开始日期移至当年的第一天。
  • 将结束日期移至其年的第一年。

半开

Joda-Time 对时间跨度使用半开方法,其中开始是包含,结束是不包含。因此,一年从相关年份的 1 月 1 日开始,一直到但不包括下一年的 1 月 1 日。

因此,您希望 2016-2017 年的日期为两年,将开始日期移至该年的第一天,将结束日期移至其年的第一年。

我们转换为 LocalDate,因为我们不关心这种年计算的时间。

LocalDate start = startDate.toLocalDate().withDayOfMonth( 1 ).withMonthOfYear( 1 );  // Move to first of same year.
LocalDate stop = endDate.toLocalDate().withDayOfMonth( 1 ).withMonthOfYear( 1 ).plusYears(1); // Move to first of *following* year.

然后用 Years 执行相同的计算。

Years yearsBetween = Years.yearsBetween( start , stop );  // Half-Open, beginning is inclusive while ending is exclusive.
int years = yearsBetween.getYears(); // Plain integer.

2 中 2016 年(移至 2016-01-01)和 2017 年(移至 2018-01-01)任何日期的结果。


java.time

仅供引用,Joda-Time项目现在在maintenance mode ,团队建议迁移到 java.time类。

这项工作在 java.time 中要简单一些。 TemporalAdjuster接口(interface)提供类来操作日期时间值。 TemporalAdjusters类(注意复数 s)提供了几个实现。这些为获得今年的第一名和明年的第一名提供了条件。

此处的 Zdt 指的是您可能拥有的 ZonedDateTime 对象。此类表示特定时区 (ZoneId) 中时间轴上的时刻,分辨率为纳秒。我们从 ZonedDateTime 对象转换为 LocalDate,然后应用一对 TemporalAdjuster 对象移动到年初和下一年年。

LocalDate start = yourStartingZdt.toLocalDate().with( TemporalAdjusters.firstDayOfYear() );
LocalDate stop = yourEndingZdt.toLocalDate().with( TemporalAdjusters.firstDayOfNextYear() );

java.time 类不包括 Joda-Time 的等价物 Years类(class)。如果需要,您可以添加 ThreeTen-Extra项目到您的应用程序以使用包含 Years 的其他类扩展 java.time类。

或者,我们可以通过 Period 类获取年数。

与 Joda-Time 一样,包括 Period 在内的 java.time 类对时间跨度使用半开方法。我建议您自己在所有日期时间工作中始终如一地使用半开,因为这将使您的代码总体上更简单且不易出错。

Period p = Period.between( start , stop );
int years = p.getYears();

2 中 2016 年(移至 2016-01-01)和 2017 年(移至 2018-01-01)任何日期的结果。

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , .Calendar , & java.text.SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 如何在 Joda-Time 中总结岁月,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40119161/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com