2011-11-21 71 views
16

Necesito obtener el número de minutos entre dos fechas. Sé que Joda es el mejor para usar, pero esto es para un proyecto de Android, por lo que prefiero usar un poco de bibliotecas externas como sea posible, y la aplicación que estoy construyendo no requiere que el cálculo sea quirúrgicamente preciso.Diferencia, en minutos, entre dos fechas

Sin embargo, el código que estoy usando no parece funcionar. Estoy tratando de obtener la cantidad de minutos entre "21/11/2011 7:00:00 AM" y "21/11/2011 1:00:00 PM" (que debe ser de 360 ​​minutos), pero el código I Estoy usando devoluciones 0:

int diff = minutesDiff(GetItemDate("11/21/2011 7:00:00 AM"), GetItemDate("11/21/2011 1:00:00 PM")); 

public static Date GetItemDate(final String date) 
{ 
    final Calendar cal = Calendar.getInstance(TimeZone.getDefault()); 
    final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss a"); 
    format.setCalendar(cal); 

    try { 
     return format.parse(date); 
    } catch (ParseException e) { 
     return null; 
    } 
} 

public static int minutesDiff(Date earlierDate, Date laterDate) 
{ 
    if(earlierDate == null || laterDate == null) return 0; 

    return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 
} 
+0

Hace? No es para mi Además, ¿por qué estás haciendo la división dos veces? –

+2

Funciona perfectamente bien para mí. La salida es -360. – Tyler

+0

No sé por qué está obteniendo cero, pero su cadena de formato es incorrecta. HH es el formato para la hora entre 0 y 23, pero como también tiene el carácter de formato, supongo que quiere que la hora esté entre 1 y 12, y debería usar hh. Actualmente, tu 1:00:00 PM se analiza como 1:00:00 AM. – Brigham

Respuesta

5

I depurado a través de su código: hay ParseException en GetItemDate() tanto de las cadenas de fecha como:

fecha unparseable: 11/21/2011 07:00:00 AM

El El problema es que el análisis de horas de AM/PM solo funciona con "hh" (¡mayúsculas!) o "KK". Al menos ese es el caso en mi teléfono (parece que algunos de nosotros no hemos visto este problema en absoluto). Probé que también funciona con una única "h" también.

hh = 1-12
KK = 0-11
HH = 0-23
kk = 1-24

cambiar su línea SimpleDateFormat a esto:

final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US); 


Esta publicación explica la "a" y Locale: Unable to parse DateTime-string with AM/PM marker

PS. Soy de Finlandia, así que debo usar la parte "Locale.US" para que funcione. Los residentes de EE. UU. Pueden probar el código sin él, creo.

13

Si su GetItemDate está fallando para cualquier fecha, obtendrá cero. En la instrucción catch, coloque una println o depuración para generar el problema y vea si eso le dice algo.

También, así como una cuestión de práctica, que cambiaría:

return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 

a:

long result = ((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 
return (int) result; 

Esto le da la oportunidad de ver el resultado de los cálculos en un IDE.

+4

Muchos (la mayoría?Los IDE tienen la capacidad de ver los valores de retorno de la función, por lo que no es necesario crear un * just * local para ese fin. Todavía no haría la división dos veces. –

+0

Buena llamada en la división de no hacer dos veces. Ni siquiera me di cuenta. – Thom

+0

Probablemente sea mejor redondear que lanzar a 'int', pero eso depende de tu intención, por supuesto. 2 minutos 59 segundos y 4 minutos 0 segundos son 59 segundos más cerca de la diferencia de 1 minuto que 2. – Tom

Cuestiones relacionadas