2012-04-25 26 views
10

que estoy tratando de hacer el cálculo de días entre 2 fechas de la siguiente manera:(Java/Android) Calcular días entre 2 fechas y presentará los resultados en un formato específico

  1. Obtener fecha actual
  2. Obtener pasado o futuro date
  3. Calcula la diferencia entre no. 1 y no 2
  4. presente la fecha en el siguiente formato
    • Si el resultado está en el pasado (hace 2 días) o en el futuro (en 2 días)
    • formato: días, semanas, meses, años

Probé de diferentes maneras pero no pude obtener el resultado que quería antes. Descubrí que Android DatePicker cuadro de diálogo convertir la fecha en entero. No he encontrado una forma de hacer que el widget DatePicket devuelva variables de fecha en lugar de enteros.

private DatePickerDialog.OnDateSetListener mDateSetListener = 
     new DatePickerDialog.OnDateSetListener() { 

      public void onDateSet(DatePicker view, **int** year, 
            **int** monthOfYear, **int** dayOfMonth) { 
       enteredYear = year; 
       enteredMonth = monthOfYear; 
       enteredDay = dayOfMonth; 
      } 
     }; 

Me trataron de convertir la fecha del sistema a entero, en base a lo anterior, pero esto no funciona muy bien cuando se trata de calcular los días entre 2 fechas.

private void getSystemDate(){ 
    final Calendar c = Calendar.getInstance(); 

     mYear = c.get(Calendar.YEAR); 
     systemYear = mYear; 

     mMonth = c.get(Calendar.MONTH); 
     systemMonth = mMonth + 1; 

     mDay = c.get(Calendar.DAY_OF_MONTH); 
     systemDay = mDay; 

} 
+0

ints no van a funcionar para calcular la diferencia e entre días. Necesitarás usar un largo (como dijo AedonEtLIRA). – jahroy

+0

Ese es el problema que estoy teniendo: de forma predeterminada, DatePicker en Android convierte la fecha en un número entero, como muestra el fragmento de código anterior. – striders

+0

No tiene sentido para mí inmediatamente cómo podría usar un int para representar una fecha. A menos que Android java sea diferente, no puede representar una marca de tiempo como int porque el valor int máximo no es lo suficientemente grande. Las marcas de tiempo son muy grandes ... como trillones y trillones. – jahroy

Respuesta

15
/** 
    * Returns a string that describes the number of days 
    * between dateOne and dateTwo. 
    * 
    */ 

public String getDateDiffString(Date dateOne, Date dateTwo) 
{ 
    long timeOne = dateOne.getTime(); 
    long timeTwo = dateTwo.getTime(); 
    long oneDay = 1000 * 60 * 60 * 24; 
    long delta = (timeTwo - timeOne)/oneDay; 

    if (delta > 0) { 
     return "dateTwo is " + delta + " days after dateOne"; 
    } 
    else { 
     delta *= -1; 
     return "dateTwo is " + delta + " days before dateOne"; 
    } 
} 

Editar: Acabo de ver la misma pregunta en otro hilo: how to calculate difference between two dates using java

Edit2: Para llegar Año/Mes/Semana, hacer algo como esto:

int year = delta/365; 
int rest = delta % 365; 
int month = rest/30; 
rest = rest % 30; 
int weeks = rest/7; 
int days = rest % 7; 
+0

¡Gracias por la información! Esto mostrará la diferencia en días. ¿Cuáles serán las formas apropiadas de mostrar esto en días, semanas Y años? – striders

+0

Necesita hacer algunas operaciones matemáticas y usar el operador de módulo. Para mostrar x segundos como minutos y segundos, debe hacer esto: int minutes = x/60; int segundos = x% 60; String timeText = minutos + "min" + segundos + "sec"; El signo de porcentaje se llama operador de módulo. – jahroy

+0

@striders Actualizado mi respuesta ... Acepte la respuesta si cree que es correcta – San

1
long delta = Date2.getTime() - Date1.getTime(); 

new Date(delta); 

A partir de aquí, que acaba de recoger su formato. Tal vez usar un formateador de fecha? En cuanto a determinar las cosas futuras y todo eso, podrías ver si el delta es positivo o negativo. Un delta negativo indicará un evento pasado.

+1

Creo que la nueva fecha (delta) no funcionará porque el delta no es los milisegundos desde el 1 de enero de 1970, 00:00:00 GMT. – San

1

Bueno, java/Android API tiene todas las respuestas para usted:

Calendar myBirthday=Calendar.getInstance(); 
    myBirthday.set(1980, Calendar.MARCH, 22); 
    Calendar now = Calendar.getInstance(); 
    long diffMillis= Math.abs(now.getTimeInMillis()-myBirthday.getTimeInMillis()); 
    long differenceInDays = TimeUnit.DAYS.convert(diffMillis, TimeUnit.MILLISECONDS); 
Cuestiones relacionadas