2017-01-30 36 views
2

我想要計算任何兩個給定時間之間的android應用程序的差異。爲了完成這個任務,我使用了JodaTime和Period類以及Period的getYears(),getDays(),getHours(),getMinutes()和getSeconds()方法。但是,我意識到它給出了日期中每個元素之間的絕對差異。例如,要求的日期我的功能2017-01-29 00:00:00 (yyyy-MM-dd HH:mm:ss)2018-01-28 00:00:00將返回:JodaTime期間返回意想不到的結果

0 years 
2 days 
0 hours 
0 minutes 
0 seconds 

當它應該在所有其他部分用零一起返回364 days。當然,它是一個Android應用程序,所以我不打印它們,我正在單獨處理顯示。我可以在我的電腦上使用LocalDateTime和Duration.between來做到這一點,但我無法在這裏使用這些類。我正在尋找一個解決方案來解決我目前的方法(下面)或者一種全新方法的建議。先謝謝你。 我目前的功能:

public int[] getDifference(DateTime start, DateTime end){ 
    Period p = new Period(start, end); 
    int[] differences = new int[5]; 
    differences[0] = p.getYears(); 
    differences[1] = p.getDays(); 
    differences[2] = p.getHours(); 
    differences[3] = p.getMinutes(); 
    differences[4] = p.getSeconds(); 
    return differences; 
} 
+0

持續時間是你想要的 - 爲什麼你不能使用它? – GreyBeardedGeek

回答

0

你爲什麼期望364天?閱讀class doc for Period

公衆詮釋getDays()

獲取週期的天場部分。

「字段部分」是這裏的關鍵。 A Period是幾年,幾個月,幾周,幾天,幾小時,幾分鐘,幾秒和幾十毫秒。例如,一年半將有兩個部分,一個年1部分和個月的6

你的輸出部分跳過了個月部分和一部分。

DateTime start = new DateTime (2017 , 1 , 29 , 0 , 0 , DateTimeZone.UTC); 
DateTime stop = new DateTime (2018 , 1 , 28 , 0 , 0 , DateTimeZone.UTC); 
Period p = new Period (start , stop); 
int[] differences = new int[ 7 ]; 
differences[ 0 ] = p.getYears(); 
differences[ 1 ] = p.getMonths(); 
differences[ 2 ] = p.getWeeks(); 
differences[ 3 ] = p.getDays(); 
differences[ 4 ] = p.getHours(); 
differences[ 5 ] = p.getMinutes(); 
differences[ 6 ] = p.getSeconds(); 
System.out.println ("differences: " + Arrays.toString (differences)); 

運行時,我們會看到11個月,4周和2天。在JavaOS El Capitan上運行Java 8 Update 121中的Joda-Time 2.8.2。

不同:0,11,4,2,0,0,0]

你可能會認爲調用toStandardDays的。但是這樣做會導致一個例外(java.lang.UnsupportedOperationException),他說:「由於此期間包含月份和月份的長度不同,因此無法轉換爲天數」。

java.time

FYI:該項目Joda-Time,現在在maintenance mode,建議遷移到java.time類。

在java.time中,未附加到時間軸的時間跨度表示爲java.time.Period中的年 - 月 - 天或java.time.Duration中的小時 - 分鐘 - 秒 - 納秒。

LocalDate類代表沒有時間和沒有時區的僅有日期的值。

java.time類避開構造函數,而是使用工廠方法。

LocalDate start = LocalDate.of (2017 , 1 , 29); 
LocalDate stop = LocalDate.of (2018 , 1 , 28); 
Period period = Period.between (start , stop); 
System.out.println ("period.toString(): " + period); 

toString的生成standard ISO 8601 format for durations一段文字。我們在這裏看到11個月和30天。顯然Joda-Time和java.time計數不同。這裏我們看到不同的結果。 Joda-Time計數週,而java.time不計數。

period.toString():P11M30D

0

您還應該設置適當的期限類型,因爲你想有一個特定的正常化年,日,小時,分鐘和秒而已,也看的javadoc。

LocalDateTime start = new LocalDateTime(2017, 1, 29, 0, 0); 
LocalDateTime end = new LocalDateTime(2018, 1, 28, 0, 0); 
Period p = new Period(start, end, PeriodType.yearDayTime().withMillisRemoved()); 
System.out.println(p); // P364D (what you expected) 

本例還適用於起始和結束的DateTime類型。

請注意,此代碼示例(作爲類喬達,時間本身的Period)不能完全移植到包含在Java的8個新java.time -API因爲後者API不能處理的日期和時間部分的持續時間。它也不能指定週期類型,即不能像PeriodType那樣控制標準化。