java - termina - Cómo calcular la próxima semana?
duracion del ciclo menstrual regular (4)
Quiero calcular con precisión el tiempo de una semana a partir de una fecha determinada, pero la salida que recibo es una hora antes.
código:
long DURATION = 7 * 24 * 60 * 60 * 1000;
System.out.println(" now: " + new Date(System.currentTimeMillis()));
System.out.println("next week: " + new Date(System.currentTimeMillis() + DURATION));
salida:
now: Wed Sep 16 09:52:36 IRDT 2015
next week: Wed Sep 23 08:52:36 IRST 2015
¿Cómo puedo calcular esto correctamente?
Prueba esto
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
cal.add(Calendar.DAY_OF_MONTH, 7);
System.out.println(cal.getTime());
Nunca confíe en la aritmética de milisegundos, hay demasiadas reglas y errores para que valga la pena (incluso en un lapso de tiempo pequeño), en su lugar utilice una biblioteca dedicada, como Time API de Java 8, JodaTime o incluso Calendar
Java 8
LocalDateTime now = LocalDateTime.now();
LocalDateTime then = now.plusDays(7);
System.out.println(now);
System.out.println(then);
Que salidas
2015-09-16T15:34:14.771
2015-09-23T15:34:14.771
JodaTime
LocalDateTime now = LocalDateTime.now();
LocalDateTime then = now.plusDays(7);
System.out.println(now);
System.out.println(then);
Que salidas
2015-09-16T15:35:19.954
2015-09-23T15:35:19.954
Calendario
Cuando no puedes usar Java 8 o JodaTime
Calendar cal = Calendar.getInstance();
Date now = cal.getTime();
cal.add(Calendar.DATE, 7);
Date then = cal.getTime();
System.out.println(now);
System.out.println(then);
Que salidas
Wed Sep 16 15:36:39 EST 2015
Wed Sep 23 15:36:39 EST 2015
nb: El "problema" que parece tener, no es un problema en absoluto, sino simplemente el hecho de que durante el período, su zona horaria parece haber ingresado / salido de ahorro de luz diurna, por lo que Date
muestra la hora, con es la compensación correcta
Como otros dijeron. Sería mejor usar la biblioteca Calendario o JodaTime. Pero la pregunta es por qué no obtuviste el resultado deseado. Fue porque currentTimeMillis()
calcula el tiempo entre "hora de la computadora" y hora universal coordinada (UTC).Ahora considera seguir el caso.
long DURATION = 7 * 24 * 60 * 60 * 1000;
Date now = new Date();
Date nextWeek = new Date(now.getTime() + DURATION);
System.out.println(" now: " + now);
System.out.println("next week: " + nextWeek);
aquí Date.getTime()
calcula el tiempo a partir de las 00:00:00 GMT cada vez y luego, al convertirlo a cadena, dará tiempo para su zona horaria local.
Editar: estaba equivocado. La razón es como dijo Simon .
El verdadero "por qué" es que el IRDT (Hora de verano de Irán) finaliza el 22 de septiembre. Es por eso que la primera fecha (16 de septiembre) en la publicación del OP se muestra como IRDT y la segunda fecha (23 de septiembre) se muestra como IRST. Como IRST (Hora estándar de Irán) es una hora antes que IRDT, la hora que se muestra es 08:52:36 en lugar de 09:52:36.