Java >> Java tutorial >  >> Java

Hvordan får man UTC+0-dato i Java 8?

tl;dr

Instant.now()

java.time

De besværlige gamle date-time-klasser, der er bundtet med de tidligste versioner af Java, er blevet erstattet af java.time-klasserne indbygget i Java 8 og nyere. Se Oracle Tutorial. Meget af funktionaliteten er blevet back-porteret til Java 6 &7 i ThreeTen-Backport og yderligere tilpasset til Android i ThreeTenABP.

Instant

En Instant repræsenterer et øjeblik på tidslinjen i UTC med en opløsning på op til nanosekunder.

Instant instant = Instant.now();

toString metoden genererer et String-objekt med tekst, der repræsenterer dato-tidsværdien ved hjælp af et af standard ISO 8601-formaterne.

String output = instant.toString();  

2016-06-27T19:15:25.864Z

Instant klasse er en grundlæggende byggeblokklasse i java.time. Dette bør være din gå-til-klasse, når du håndterer dato-tid, da den bedste praksis generelt er at spore, gemme og udveksle dato-tidsværdier i UTC.

OffsetDateTime

Men Instant har begrænsninger såsom ingen formateringsmuligheder til at generere strenge i alternative formater. For mere fleksibilitet, konverter fra Instant til OffsetDateTime . Angiv en offset-fra-UTC. I java.time betyder det en ZoneOffset objekt. Her vil vi holde os til UTC (+00), så vi kan bruge den praktiske konstant ZoneOffset.UTC .

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

2016-06-27T19:15:25.864Z

Eller spring Instant over klasse.

OffsetDateTime.now( ZoneOffset.UTC )

Nu med en OffsetDateTime objekt i hånden, kan du bruge DateTimeFormatter at oprette String-objekter med tekst i alternative formater. Søg i Stack Overflow for mange eksempler på brug af DateTimeFormatter .

ZonedDateTime

Når du vil vise vægurs tid for en bestemt tidszone, skal du anvende en ZoneId for at få en ZonedDateTime .

I dette eksempel anvender vi Montréal tidszone. Om sommeren, under sommertid (DST) nonsens, har zonen en offset på -04:00 . Så bemærk, hvordan tidspunktet på dagen er fire timer tidligere i outputtet, 15 i stedet for 19 timer. Instant og ZonedDateTime begge repræsenterer det samme samtidige øjeblik, blot set gennem to forskellige linser.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

2016-06-27T15:15:25.864-04:00[America/Montreal]

Konvertering

Selvom du bør undgå de gamle dato-tidsklasser, kan du, hvis du skal, konvertere ved at bruge nye metoder tilføjet til de gamle klasser. Her bruger vi java.util.Date.from( Instant ) og java.util.Date::toInstant .

java.util.Date utilDate = java.util.Date.from( instant );

Og går den anden vej.

Instant instant= utilDate.toInstant();

På samme måde, se efter nye metoder tilføjet til GregorianCalendar (underklasse af Calendar ) for at konvertere til og fra java.time.ZonedDateTime .

Om java.time

java.time framework er indbygget i Java 8 og nyere. Disse klasser erstatter de besværlige gamle gamle dato-tidsklasser såsom java.util.Date , Calendar , &SimpleDateFormat .

Se Oracle Tutorial for at lære mere . Og søg i Stack Overflow for mange eksempler og forklaringer. Specifikationen er JSR 310.

Joda-tiden projekt, nu i vedligeholdelsestilstand, rådgiver migrering til java.time-klasserne.

Du kan udveksle java.time objekter direkte med din database. Brug en JDBC-driver, der er kompatibel med JDBC 4.2 eller nyere. Intet behov for strenge, intet behov for java.sql.* klasser. Hibernate 5 og JPA 2.2 understøtter java.time .

Hvor får man java.time klasserne?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , og senere - En del af standard Java API med en bundtet implementering.
    • Java 9 bragte nogle mindre funktioner og rettelser.
  • Java SE 6 og Java SE 7
    • Det meste af java.time funktionalitet er back-porteret til Java 6 og 7 i ThreeTen-Backport .
  • Android
    • Senere versioner af Android (26+) bundter implementeringer af java.time klasser.
    • For tidligere Android (<26), en proces kendt som API-afsugning bringer et undersæt af java.time funktionalitet, der ikke oprindeligt var indbygget i Android.
      • Hvis afsukkeringen ikke tilbyder det, du har brug for, kan ThreeTenABP projektet tilpasser ThreeTen-Backport (nævnt ovenfor) til Android. Se Sådan bruger du ThreeTenABP... .

Med Java 8 kan du skrive:

OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);

For at besvare din kommentar kan du derefter konvertere den til en dato (medmindre du er afhængig af ældre kode, jeg kan ikke se nogen grund til det) eller til millis siden epokerne:

Date date = Date.from(utc.toInstant());
long epochMillis = utc.toInstant().toEpochMilli();

I java8 ville jeg bruge Instant klasse, som allerede er i UTC og er praktisk at arbejde med.

import java.time.Instant;

Instant ins = Instant.now();
long ts = ins.toEpochMilli();

Instant ins2 = Instant.ofEpochMilli(ts)

Alternativt kan du bruge følgende:

import java.time.*;

Instant ins = Instant.now(); 

OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));

Tilbage til Instant

Instant ins4 = Instant.from(odt);

Java tag