我已经使用Joda-Time joda-time-2.3.jar 进行Android应用的日计算。我的代码是......
Period Nextperiod = new Period(ddate, nextdt,PeriodType.yearMonthDay());
在 ddate 和 nextdt 中日期时间 两个日期都是输入类型,格式为SimpleDateFormat,对于日差我使用 Nextperiod.getDays()现在测试用例是,
在案例2中它应该是14当我插入29或者30天时可能会有12天相同的结果。我不知道这个日期有什么不对。我测试了一些更多的日期和结果是按照我的期望。让我知道我的错误。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
Period Nextperiod = new Period(new LocalDate(Ddate), new LocalDate(Ddate),PeriodType.yearMonthDay());
提前致谢。
答案 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)
java.time.Period.between( startLocalDate , stopLocalDate )
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" ) ;
您可以通过致电LocalDate
从OffsetDateTime
或ZonedDateTime
提取仅限日期的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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?