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.