在某些情况下,Joda-Time Period问题

时间:2014-06-06 07:35:28

标签: java android jodatime

我已经使用Joda-Time joda-time-2.3.jar 进行Android应用的日计算。我的代码是......

Period Nextperiod = new Period(ddate, nextdt,PeriodType.yearMonthDay());

ddate nextdt 日期时间 两个日期都是输入类型,格式为SimpleDateFormat,对于日差我使用 Nextperiod.getDays()现在测试用例是,

Case 1 Right
ddate=2014-06-01T00:00:00.000+05:30
nextdt =2015-04-11T00:00:00.000+05:30
Day: 10
Month: 10
year: 0

Case 2 Wrong ddate= 2014-05-28T00:00:00.000+05:30 nextdt=2015-03-12T00:00:00.000+05:30 Day: 12 Month: 9 year: 0

在案例2中它应该是14当我插入29或者30天时可能会有12天相同的结果。我不知道这个日期有什么不对。我测试了一些更多的日期和结果是按照我的期望。让我知道我的错误。
也试过,
Period Nextperiod = new Period(new LocalDate(Ddate), new LocalDate(Ddate),PeriodType.yearMonthDay());
提前致谢。

2 个答案:

答案 0 :(得分:2)

如果您尝试逐步将9个月和12天添加到开始日期(ddate),则可以看到案例2示例正确的原因。

2015-05-28增加了9个月的结果2015-02-28。这是2015年2月的最后一天,因此在2015-03-12收到12天的收益。

这也适用于开始日期为5月29日或5月30日的测试用例:这些日期和结束日期之间的时间段为9个月和12天。

答案 1 :(得分:0)

TL;博士

java.time.Period.between( startLocalDate , stopLocalDate )

java.time

Modus Tollens的accepted Answer是正确的。

仅供参考,Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。请参阅Tutorial by Oracle

以下是代码的现代版本。

将您给定的字符串解析为OffsetDateTime,因为它们包含来自UTC的偏移但不包括完整时区。

OffsetDateTime start = OffsetDateTime.parse( "2014-05-28T00:00:00.000+05:30" ) ;

如果已知,最好使用时区而非偏移。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime start = LocalDate.parse( "2014-05-28" ).atStartOfDay( z ) ;

如果您真的想要使用仅限日期而非日期时间,请使用LocalDate类。

LocalDate start = LocalDate.parse( "2014-05-28" ) ;

您可以通过致电LocalDateOffsetDateTimeZonedDateTime提取仅限日期的toLocalDate

使用Period类表示要跳转的时间范围。

Period p = Period.ofMonths( 9 ).plus( Period.ofDays( 12 ) ) ;

通过生成字符串验证该值是标准的ISO 8601格式。

String pOutput = p.toString() ;
  

P9M12D

将句点添加到开始日期或日期时间。

LocalDate later = start.plus( p ) ; // Add the `Period` span-of-time to our starting date.

要计算已用时间,请使用Period.between

Period p = Period.between( startLocalDate , stopLocalDate ) ;

关于 java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?