2010-10-17 40 views
3

我确定以前用其他方式询问过我无法找到,所以我很抱歉重复,如果我是。Java格式日期之间的详细区别

我想计算两个日期之间的差异,然后显示天,分,秒的差异;像“3天23分59秒”

很容易,我敢肯定,但我是一个C#人的练习,所以我很难在这个盒子上开箱即用。

提前致谢!

回答

3
Date start = new Date(2010, 10, 13); 
Date end = new Date(2010, 10, 18); 

long diffInMillis = end.getTime() - start.getTime(); 

long diffInDays = diffInMillis/1000/86400; 
long diffInHours = (diffInMillis/1000 - 86400*diffInDays)/3600; 
long diffInMins = (diffInMillis/1000 - 86400*diffInDays - 3600*diffInHours)/60; 
long diffInSecs = (diffInMillis/1000 - 86400*diffInDays - 3600*diffInHours - 60*diffInMins); 
+0

事端的使用的数字错误。这是我想去的方向。 – BennyT 2010-10-17 04:38:22

+0

@BennyT,现在应该工作。 – 2010-10-17 04:46:47

+0

谢谢@Mark! – BennyT 2010-10-17 04:53:14

5

对于当前是标准Java API的一部分的Calendar和Date对象,没有直接的做法。您可以找到两个日期之间的毫秒数并使用算术。这取决于您的准确性需求,例如您是否需要考虑闰年。这会使计算更加混乱,但仍然可行。

Joda-Time库提供了一个Period对象,它完全符合您所期待的。

+0

现在我会坚持乔达,内置日历的东西足以让你恶心。 – 2010-10-17 04:26:47

+0

我会,但包括我的应用程序的一个小部分的lib没有多大意义,是吗? – BennyT 2010-10-17 04:38:54

0

这是我做的,我的作品,但我敢肯定,它可以改善,甚至还没有,也许有一个隐藏的(对我来说)类,这是否......

/*Imports*/ 

package javatest; 
import java.util.Date; 
public class Main { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     long segundo = 1000; 
     long minuto = segundo * 60; 
     long hora = minuto * 60; 
     long dia = hora * 24; 
     long semana = dia * 7; 
     long mes = dia * 30; 
     long anio = mes * 12; 

     long startDate = new Date().getTime(); 
     //startDate = startDate - (semana + hora + 30 * minuto + anio*2); 
     startDate = startDate - (mes); 
     long endDate = new Date().getTime(); 

     System.out.println("Inicio: " + new Date(startDate)); 
     System.out.println("Final: " + new Date(endDate)); 

     System.out.println(PrettifyDateDiff(endDate - startDate, true)); 
    } 

    private static String PrettifyDateDiff(long dateDiff, boolean showDisclaimer) { 
     /* Constantes utilizadas para facilitar 
     * la lectura de la aplicación 
     */ 

     long second = 1000; 
     long minute = second * 60; 
     long hour = minute * 60; 
     long day = hour * 24; 
     long week = day * 7; 
     long month = day * 30; 
     long year = month * 12; 

     // Dividimos los milisegundos entre su equivalente de 
     // las constantes de arriba para obtener el valor en la 
     // escala de tiempo correspondiente. 
     long minutes = dateDiff/minute; 
     long hours = dateDiff/hour; 
     long days = dateDiff/day; 
     long weeks = dateDiff/week; 
     long months = dateDiff/month; 
     long years = dateDiff/year; 

     String prettyDateString = ""; 

     if (minutes > 60) { 
      prettyDateString = minutes - (hours * 60) + " minutos."; 

      if (hours > 24) { 
       prettyDateString = hours - (days * 24) + " horas " + prettyDateString; 

       if (days > 7) { 
        prettyDateString = days - (weeks * 7) + " dias " + prettyDateString; 

        if(weeks > 4){ 
         prettyDateString = weeks - (months * 4) + " semanas " + prettyDateString; 

         if(months > 12){ 

          prettyDateString = months - (years * 12) + " meses " + prettyDateString; 

          if(years > 0){ 
           prettyDateString = years + " años " + prettyDateString; 
          } 
         }else{ 
          prettyDateString = months + " meses " + prettyDateString; 
         } 

        }else{ 
         prettyDateString = weeks + " semanas " + prettyDateString; 
        } 
       } else { 
        prettyDateString = days + " dias " + prettyDateString; 
       } 
      } else { 
       prettyDateString = hours + " horas " + prettyDateString; 
      } 

     } else { 
      prettyDateString = minutes + " minutos."; 
     } 

     if(showDisclaimer && (weeks > 0 || months > 0)){ 
      prettyDateString += " (Semanas de 7 dias, Meses de 30 dias)."; 
     } 

     return prettyDateString; 
    } 
}