in

java – milisegundos a días

apple touch icon@2

No puedes. Perdón. O más precisamente: puede hacerlo si conoce una zona horaria y una hora de inicio (o hora de finalización). Un día puede tener una duración de 23, 24 o 25 horas o alguna otra duración. Por lo tanto, no existe una fórmula segura para convertir de milisegundos a días. Entonces, si bien puede confiar de manera segura en 1000 milisegundos en un segundo, 60 segundos en un minuto (reserva a continuación) y 60 minutos en una hora, la conversión a días necesita más contexto para ser segura y precisa.

Reserva: en la vida real, un minuto es ocasionalmente 61 segundos debido a un segundo intercalar. No en Java. Java siempre cuenta un minuto como 60 segundos porque los relojes de computadora comunes no conocen los segundos intercalares. Los sistemas operativos comunes y el propio Java no solo conocen el horario de verano (DST), sino también muchas otras anomalías en la línea de tiempo que hacen que un día sea más corto o más largo que 24 horas.

Demostrar. Escribo esto el 29 de marzo de 2021, el día después de que mi zona horaria, Europa / Copenhague, y el resto de la UE cambiaran al horario de verano.

    ZoneId myTimeZone = ZoneId.of("Europe/Copenhagen");
    ZonedDateTime now = ZonedDateTime.now(myTimeZone);
    ZonedDateTime twoDaysAgo = now.minusDays(2);
    ZonedDateTime inTwoDays = now.plusDays(2);
    
    System.out.println(ChronoUnit.MILLIS.between(twoDaysAgo, now));
    System.out.println(ChronoUnit.MILLIS.between(now, inTwoDays));

Producción:

169200000
172800000

Entonces, cuántos milisegundos hay en dos días depende de a qué dos días te refieres. Y en qué zona horaria.

¿Entonces lo que hay que hacer?

  1. Si para su propósito puede definir con seguridad un día como 24 horas siempre, por ejemplo, porque sus días se cuentan en UTC o sus usuarios están de acuerdo con la inexactitud, use Duration o TimeUnit. Desde Java 9 el Duration Además, la clase te dirá cuántas horas, minutos y segundos hay además de los días completos. Vea la respuesta de Arvind Kumar Avinash. Para el TimeUnit enum vea las respuestas de whaley y Dev Parzival. En cualquier caso, la buena noticia es que no importa si apestar en matemáticas porque las matemáticas están a cargo de ti.

  2. Si conoce una zona horaria y un punto de partida, utilice ZonedDateTime y ChronoUnit.DAYS. En este caso también se encargan de las matemáticas.

    ZonedDateTime start = LocalDate.of(2021, Month.MARCH, 28).atStartOfDay(myTimeZone);
    long millisToConvert = 170_000_000;
    
    ZonedDateTime end = start.plus(millisToConvert, ChronoUnit.MILLIS);
    long days = ChronoUnit.DAYS.between(start, end);
    System.out.format("%d days%n", days);
    
2 days

Si además desea las horas, minutos y segundos:

    Duration remainingTime = Duration.between(start.plusDays(days), end);
    System.out.format(" - and an additional %s hours %d minutes %d seconds%n",
            remainingTime.toHours(),
            remainingTime.toMinutesPart(),
            remainingTime.toSecondsPart());
 - and an additional 0 hours 13 minutes 20 seconds

Si, en cambio, tenía un punto final, reste sus milisegundos del punto final usando el minus método (en lugar del plus método utilizado en el código anterior) para obtener el punto de inicio.

Bajo ninguna circunstancia haga los cálculos usted mismo como en la pregunta y en la respuesta actualmente aceptada. Es propenso a errores y da como resultado un código difícil de leer. Y si tu lector apesta en matemáticas, él o ella puede dedicar mucho tiempo valioso al desarrollador tratando de verificar que lo ha hecho correctamente. Deje las matemáticas a los métodos probados de la biblioteca, y será mucho más fácil para su lector confiar en que su código es correcto.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

problem recognition

Comportamiento del consumidor: reconocimiento de problemas

m4TGD3LgQXwtDq8W8S8SJh 1200 80

Guía de Fallout 76: todo lo que necesitas para convertirte en el vagabundo de las tierras baldías definitivo