2017-01-28 127 views
1

對於我的大學項目(酒店管理系統),我需要計算兩個日期之間的差異,我只是使用隨後的代碼工作。以天爲單位計算兩個日期之間的差異

txtarrivaldate.getDate(); 
    txtdeparturedate.getDate(); 
    long arrivalmillisec = txtarrivaldate.getDate().getTime(); 
    // System.out.println(arrivalmillisec); 
    long departuremillisec = txtdeparturedate.getDate().getTime(); 
    // System.out.println(departuremillisec); 
    long diffmilisec = (departuremillisec - arrivalmillisec); 
    long diffdays = (departuremillisec - arrivalmillisec)/(24 * 60 * 60 * 1000); 
    String noofdays = Long.toString(diffdays); 
     System.out.println(noofdays); 

但是我遇到了其他Java項目,他們有代碼

static final long ONE_HOUR = 60 * 60 * 1000L; 
dt1=jDateChooser1.getDate(); 
     dt2=jDateChooser2.getDate(); 
     String strdtver1=(String) sdf.format(jDateChooser1.getDate()); 
     String strdtver2=(String) sdf.format(jDateChooser2.getDate()); 
     long diff=((dt2.getTime()-dt1.getTime()+ONE_HOUR)/(ONE_HOUR*24)); 
     diffday=Long.toString(diff); 
     jTextField4.setText(diffday+" day(s)"); 

我couldnot知道爲什麼ONE_HOUR已添加兩個dates.I之間會急切地想感謝排序混亂。

+1

當夏令時開始時,他們正試圖避免摔倒。如果你的範圍有23小時的日子,那麼除非你加上一小時,否則這個師不會產生正確的結果。 –

+0

爲什麼你不能使用org.joda.time.Days? – Trying

+0

只是一個評論 - 約達近三年來已經過時了。新的Java 8類將是更好的選擇。 –

回答

4

這可能是因爲timezone的差異(UTC與BST或其他)。第二種方法是嘗試修復它通過添加一小時到結束日期。

我建議設置在應用程序啓動時default時區,讓Java處理timezone轉換,如:

public static void main(String[] args) throws Exception { 
    TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    Date d1 = sdf.parse("2017-01-20"); 
    Date d2 = sdf.parse("2017-01-28"); 
    long diffdays = (d2.getTime() - d1.getTime())/(24 * 60 * 60 * 1000); 
    System.out.println(diffdays); 
} 

另一種方法是使用Java 8的日期時庫來計算日子,例如:

public static void main(String[] args) throws Exception { 
    TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    Date d1 = sdf.parse("2017-01-20"); 
    Date d2 = sdf.parse("2017-01-28"); 
    long days = Duration.between(d1.toInstant(), d2.toInstant()).toDays(); 
    System.out.println(days); 
} 

Here的的Javadoc Duration類。

0

Answer by Mehta是正確的。

使用java.time

此外,您完全使用錯誤的類。

麻煩的舊日期時間類(DateCalendar等)現在是遺留的,被java.time類取代。

Instant

代替java.util.Date使用InstantInstant類表示UTC中時間軸上的一個時刻,分辨率爲nanoseconds(小數點後最多九(9)位數字)。

如果您需要與尚未更新爲java.time的舊代碼進行接口轉換。尋找新的方法添加到舊的類。

Instant instant = myJavaUtilDate.toInstant(); 

通常最好使用UTC,尤其是數據存儲和數據交換。因此請經常使用Instant類。

時區

要確定日期,我們需要確定日期。而爲了確定日期,我們需要時區。對於任何特定的時刻,日期因地區而異。例如,午夜過後幾分鐘,法國巴黎是一個新的一天,而在魁北克蒙特利爾仍然是「昨天」。

ZonedDateTime

應用的時區(ZoneId)獲得ZonedDateTime

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(); 

ChronoUnit

不要嘗試自己做的日期時間的數學。首先,你假設每小時60分鐘,每天24小時,等等。你會錯的。例如夏令時(DST)和政治家經常重新定義時區的異常意味着這樣的假設是錯誤的。讓java.time做數學。

你似乎想要兩個時間點之間的天數。爲此,請使用ChronoUnit枚舉,實現TemporalUnit。當提供ZonedDateTime對象時,ChronoUnit課程對時區和異常情況(如DST轉換)非常瞭解。請務必閱讀課程文檔,以瞭解和了解其在這種情況下的行爲。

long days = ChronoUnit.DAYS.between(zdtStart , zdtStop); 

關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

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

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

相關問題