2014-06-06 40 views
2

我已經使用Joda-Timejoda-time-2.3.jar用於Android應用程序的一天計算。我的代碼是...Joda時間問題在某些情況下

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

在這種ddatenextdt日期時間 兩個日期是輸入型這與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());
在此先感謝。

+0

FYI時,[喬達-時間](http://www.joda.org/joda-time/)項目現在在[維護模式](https://en.wikipedia.org/wiki/Maintenance_mode),團隊建議遷移到[java.time](http://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary.html)類。請參見[Oracle教程](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 –

回答

2

如果您嘗試逐步向開始日期(ddate)添加9個月和12天,您可以看到爲什麼Case 2示例正確。

在2015-02-28添加9個月至2014-05-28的結果。這是2015年2月的最後一天,因此2015年3月12日增加12天收益率。

這也適用於開始日期爲5月29日或5月30日的測試用例:這些日期和結束日期之間的期間爲9個月和12天。

+0

偉大的答案我很愚蠢! +1 –

0

TL;博士

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

java.time

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無論從OffsetDateTimeZonedDateTime致電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.Date,Calendar,& SimpleDateFormat

Joda-Time項目,現在在maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

相關問題