Java >> Java tutorial >  >> Tag >> java.util

Forskellig tidskonvertering ved at bruge java.util.Date i Java

En Date objekt repræsenterer et bestemt tidspunkt i tiden, repræsenteret af et givet antal millisekunder siden Unix-epoken.

toString() metode konverterer det øjeblik i tid til et lokalt tid baseret på standardtidszonen. Det er ikke det Date værdien i sig selv "har" en tidszone - den er bare toString() der bruger standarden.

Disse data formodes at blive behandlet som 21:15 på alle servere.

Det tyder på, at du vil bruge den indiske tidszone på alle servere, i det mindste når du konverterer øjeblikkeligt til visning. Uden at vide noget mere om din ansøgning, er det alt, vi kan sige... bortset fra "brug ikke java.util.Date eller java.util.Calendar; brug java.time klasser i stedet". De er meget bedre designet, og du er mindre tilbøjelig til at løbe ind i problemer som dette.


java.time

Jeg anbefaler, at du bruger java.time, den moderne Java dato og klokkeslæt API, til dit dato- og tidsarbejde.

    long scheduledTime = 1_602_258_300_000L;
    Instant pointInTime = Instant.ofEpochMilli(scheduledTime);
    System.out.println(pointInTime);

Output fra dette uddrag vil være det samme på alle servere i alle tidszoner:

2020-10-09T15:45:00Z

Da du ønsker 21:15, skal du angive tidszonen for Indien:

    ZoneId serverTimeZone = ZoneId.of("Asia/Kolkata");
    ZonedDateTime dateTime = pointInTime.atZone(serverTimeZone);
    System.out.println(dateTime);

2020-10-09T21:15+05:30[Asien/Kolkata]

Hvad gik galt?

Epoken er et tidspunkt uafhængig af tidszone. så et antal millisekunder angiver også et tidspunkt. I dit tilfælde er dette tidspunkt fredag ​​den 9. oktober 2020 kl. 15:45:00 UTC. Og på det tidspunkt var klokken 21:15 i Indien og 11:45 på Nordamerikas østkyst. Det er et forvirrende træk ved den forældede Date klasse, at den på den ene side kun repræsenterer et tidspunkt, på den anden side dens toString metoden griber tidszoneindstillingen for JVM og bruger den til at gengive strengen, der skal returneres, hvilket giver dig det falske indtryk, at du får forskellige Date objekter i forskellige tidszoner, når de faktisk er ens.

Links

  • Oracle-øvelse:Dato Tid, der forklarer, hvordan du bruger java.time.
  • Epoke- og Unix-tidsstempelkonverteringsværktøjer, hvor du kan tjekke, hvad der svarer til dine millisekunder i UTC/GMT og i din egen tidszone.

Java tag