2011-06-02 188 views
3

我有兩個Date s。我怎樣才能在幾天內分辨這兩個日期之間的差異?我曾聽說過SimpleDateFormat,但我不知道如何使用它。如何查找兩個日期之間的天數?

我嘗試這樣做:

String fromdate = "Apr 10 2011"; 

SimpleDateFormat sdf; 
sdf = new SimpleDateFormat("MMM DD YYYY"); 

sdf.parse(fromdate); 

Calendar cal = Calendar.getInstance(); 
cal.setTime(sdf); 

我也試過這樣:

String date1 = "APR 11 2011"; 
String date2 = "JUN 02 2011"; 
String format = "MMM DD YYYY"; 
SimpleDateFormat sdf = new SimpleDateFormat(format); 
Date dateObj1 = sdf.parse(date1); 
Date dateObj2 = sdf.parse(date2); 
long diff = dateObj2.getTime() - dateObj1.getTime(); 
int diffDays = (int) (diff/(24* 1000 * 60 * 60)); 
System.out.println(diffDays); 

,但我得到了異常 「非法字符模式 'Y'。」

+0

你說的*區別意味着*?你想測試哪一個更及時,或者你只是想知道它們是不同的? – 2011-06-02 18:49:10

+4

請參閱http://stackoverflow.com/questions/5497762/find-time-differnce和http://stackoverflow.com/questions/5194216/how-can-i-calculate-the-difference-between-two-dates和http://stackoverflow.com/questions/1116123/how-do-i-calculate-someones-age-in-java – x4u 2011-06-02 18:49:45

+1

什麼區別?毫秒?天?天,小時,分鐘?等等請注意'DD'和'YYYY'是幾天和幾年的無效模式。閱讀javadoc:http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html – BalusC 2011-06-02 18:50:47

回答

0

此代碼應該告訴你怎麼做,你需要什麼...

public static void main(String[] args) { 
    Calendar firstOfTheMonthCalendar = Calendar.getInstance(); 
    firstOfTheMonthCalendar.set(Calendar.DAY_OF_MONTH, 1); 

    Date firstOfTheMonthDate = firstOfTheMonthCalendar.getTime(); 
    Date nowDate = new Date(); 

    int diffInDays = determineDifferenceInDays(firstOfTheMonthDate, nowDate); 
    System.out.println("Number of days betweens dates: " + diffInDays); 
} 

private static int determineDifferenceInDays(Date date1, Date date2) { 
    Calendar calendar1 = Calendar.getInstance(); 
    calendar1.setTime(date1); 
    Calendar calendar2 = Calendar.getInstance(); 
    calendar2.setTime(date2); 
    long diffInMillis = calendar2.getTimeInMillis() - calendar1.getTimeInMillis(); 
    return (int) (diffInMillis/(24* 1000 * 60 * 60)); 
} 
+0

我閱讀了nsfyn55答案中的博客文章,看來我的解決方案在某些時區不起作用。表達方式顯示瞭解決這個問題的更確切的方式,但我的答案應該在大多數情況下工作。 – 2011-06-03 14:10:54

1

你有兩個日期對象?

答案不能簡單。

public double computeDaysBetweenDates(Date d1, Date d2) { 
    long diff; 

    diff = d2.getTime() - d1.getTime(); 
    return ((double) diff)/(86400.0 * 1000.0); 
} 

Date對象周圍包含UTC POSIX EPOCH時間,這是因爲午夜,1970年1月1日UTC以來經過的毫秒數長薄的包裝。你只需從後面的值中減去前面的值就可以得到你的間隔毫秒數。知道這一點,你只需在一天內除以毫秒數。

請注意,這個答案假設一天是86400秒,並且......大部分都是如此。

請注意,即使您已格式化日期字符串,此解決方案仍然適用。如果您能夠首先將日期/時間解析爲Date對象,那麼您仍然可以與它們一起調用此函數。

+0

這篇文章僅告訴您兩個日期之間的24小時期間的數量,而不是日曆天數 – robjwilkins 2015-10-30 08:43:50

+0

「天數差異」與「日曆天差異」之間的區別是什麼「? – scottb 2015-11-07 23:38:08

2

其他答案是正確的,但過時了。

java.time

java.time框架是建立在Java 8和更高版本。這些課程取代了老的麻煩日期時間課程,如java.util.Date,.Calendar,& java.text.SimpleDateFormatJoda-Time團隊還建議遷移到java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。

許多java.time功能被移植到Java中,並在ThreeTen-Backport中被移植到Java中,並進一步適用於Android中的ThreeTenABP

ThreeTen-Extra項目擴展了java。有額外的課程時間。這個項目是未來可能增加java.time的一個試驗場。

LocalDate

LocalDate類表示沒有時間一天和不同時區的日期,唯一的價值。

我建議在可能的情況下使用標準的ISO 8601格式。但在你的情況下,我們需要指定一個格式化模式。

String input = "Apr 10 2011"; 

DateTimeFormatter f = DateTimeFormatter.ofPattern ("MMM d uuuu"); 
LocalDate earlier = LocalDate.parse (input , f); 

DateTimeFormatter formatterOut = DateTimeFormatter.ofLocalizedDate (FormatStyle.MEDIUM).withLocale (Locale.US); 
String output = earlier.format (formatterOut); 

LocalDate later = earlier.plusDays (13); 

long days = ChronoUnit.DAYS.between (earlier , later); 

轉儲到控制檯。

System.out.println ("from earlier: " + earlier + " to later: " + later + " = days: " + days + " ending: " + output); 

從早期:2011-04-10以後:2011-04-23 =天數:13結束:2011年4月10日

相關問題