Java Dato og tid

โšก Smart opsummering

Java Dato- og tidshรฅndtering kombinerer de รฆldre java.util.Date- og SimpleDateFormat-klasser med den moderne java.time API, der blev introduceret i Java 8, hvilket giver udviklere uforanderlige, trรฅdsikre typer til prรฆcist kalenderarbejde.

  • ๐Ÿ•’ Arvsdato: java.util.Date-klassen gemmer et รธjeblik i millisekunder og udskriver en standardstreng frem til toString.
  • ๐Ÿ”ค Mรธnsterbogstaver: SimpleDateFormat bruger bogstaver som รฅรฅรฅรฅ, MM, dd, HH, mm, ss og zzz til at definere brugerdefinerede outputformater.
  • โš–๏ธ Sammenligning: Metoden compareTo returnerer et negativt, nul eller positivt heltal for at sortere to Date-instanser kronologisk.
  • ๐Ÿ†• Moderne API: LocalDate, LocalDateTime, ZonedDateTime og Instant i java.time erstatter Date og Calendar med uforanderlige objekter.
  • ๐Ÿงต Trรฅdsikkerhed: DateTimeFormatter er uforanderlig og sikker at dele, mens SimpleDateFormat krรฆver synkronisering eller en ThreadLocal-wrapper.
  • ๐Ÿ” interoperabilitet: Konverter mellem de gamle og nye API'er ved hjรฆlp af hjรฆlperne Date.toInstant, Date.from og Calendar.toInstant.

Java Dato og tid

Hรฅndtering af datoer og klokkeslรฆt i Java er en rutinemรฆssig del af opbygningen af โ€‹โ€‹planlรฆgningslogik, logtidsstempler, rapporter og revisionsspor. Fรธr man skriver kode, er det nyttigt at kende de parametre, der udgรธr en dato:

  • รฅr (med to eller fire cifre).
  • mรฅned (som to cifre, som de fรธrste tre bogstaver i mรฅneden eller som hele mรฅnedens navn).
  • dato (det faktiske nummer pรฅ mรฅnedens dag).
  • dag (dagens navn pรฅ den givne dato, f.eks. sรธn, man, tir).

Java afslรธrer mange andre parametre, der beskriver et รธjeblik pรฅ tidslinjen, herunder รฆra, uge โ€‹โ€‹i รฅret, tidszone og forskydning. Afsnittene nedenfor dรฆkker hver af dem med eksempler, der kan kรธres.

Sรฅdan bruger du Dato i Java

Vis dato i Java

Java tilvejebringer en Date klasse i java.util pakke. Klassen gemmer et specifikt tidspunkt med en prรฆcision pรฅ millisekunder og tilbyder hjรฆlpemetoder til at udskrive, sammenligne og formatere det pรฅgรฆldende tidspunkt. For at fรฅ den aktuelle dato og det aktuelle klokkeslรฆt skal du instansiere klassen med dens standardkonstruktรธr:

import java.util.Date;

class Date_Ex1 {
    public static void main(String args[]) {
        // Instantiate a Date object by invoking its constructor
        Date objDate = new Date();
        // Display the Date and Time using toString()
        System.out.println(objDate.toString());
    }
}

Output:

Wed Nov 29 06:36:22 UTC 2017

Eksemplet udskriver datoen i standard toString-formatet. For at vise det samme รธjeblik i et andet mรธnster, skal du fรธrst forstรฅ formateringsbogstaverne, der Java anvendelser.

SimpleDateFormat: Parse og formater datoer

SimpleDateFormat klasse i java.text konverterer en Date objektet ind i en formateret streng og analyserer en formateret streng tilbage til en DateDen bruger mรธnsterbogstaver, der knyttes til en dato- eller tidskomponent. Tabellen nedenfor viser alle understรธttede bogstaver:

BrevDato- eller tidskomponentEksempel
GEpoke betegnerAD
yร…r2026
MMรฅned i รฅrjuli eller juli eller 07
wUge i รฅr27
WUge i mรฅned2
DDag i รฅr189
dDag i mรฅned10
FUgedag i mรฅned2
EDagens navn i ugentirsdag eller tirsdag
uDagnummer i ugen (1 = Monday, 7 = sรธndag)1
aAM- eller PM-markรธrPM
HTime om dagen (0-23)0
kTime om dagen (1-24)24
KTime i AM eller PM (0-11)0
hTime i AM eller PM (1-12)12
mMinut i time30
sAnden pรฅ minut55
Smillisekund978
zTidszone (navn)Pacific Standard Time; PST; GMT-08:00
ZTidszone (RFC 822-forskydning)-0800
XTidszone (ISO 8601-forskydning)-08 eller -0800 eller -08:00

Du behรธver ikke at huske hele tabellen. Brug den, nรฅr du bygger et nyt mรธnster.

Sรฅdan bruger du SimpleDateFormat

SimpleDateFormat er en underklasse af DateFormat der lader dig formatere og analysere datoer ved hjรฆlp af ovenstรฅende mรธnsterbogstaver. Kombiner bogstaverne for at beskrive prรฆcis den streng, du vil producere eller lรฆse.

For eksempel:

  1. Pรฅkrรฆvet datoformat: 2012.10.23 20:20:45 PSTDet passende formatmรธnster er yyyy.MM.dd HH:mm:ss zzz.
  2. Pรฅkrรฆvet datoformat: 09:30:00 AM 23-May-2012Det passende formatmรธnster er hh:mm:ss a dd-MMM-yyyy.

Tip: Bogstaver i urkassen. Store bogstaver. M er mรฅned, med lille bogstav m er et minut. Store bogstaver H er et 24-timers ur, med smรฅ bogstaver h er et 12-timers ur. At blande dem sammen giver lydlรธst forkert output.

Programmet nedenfor udskriver den aktuelle dato to gange, รฉn gang i standardformat og รฉn gang via et SimpleDateFormat-mรธnster:

import java.text.SimpleDateFormat;
import java.util.Date;

class TestDates_Format {
    public static void main(String args[]) {
        // Current system date and time is assigned to objDate
        Date objDate = new Date();
        System.out.println(objDate);

        // Build the target pattern and format the date
        String strDateFormat = "hh:mm:ss a dd-MMM-yyyy";
        SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat);
        System.out.println(objSDF.format(objDate));
    }
}

Output:

Wed Nov 29 06:31:41 UTC 2017
06:31:41 AM 29-Nov-2017

Sammenlign Datoer Eksempel

Sammenlign Datoer Eksempel

Den mest pรฅlidelige mรฅde at bestille to pรฅ Date objekterne er compareTo() Metoden. Den returnerer et negativt heltal, nรฅr kalderen er tidligere, nul, nรฅr begge tidspunkter er ens, og et positivt heltal, nรฅr kalderen er senere. Kodestykket nedenfor analyserer to dato-strenge og udskriver deres relative rรฆkkefรธlge:

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;

class TestDates_Compare {
    public static void main(String args[]) throws ParseException {

        SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy");
        Date dt_1 = objSDF.parse("20-08-1981");
        Date dt_2 = objSDF.parse("12-10-2012");

        System.out.println("Date1 : " + objSDF.format(dt_1));
        System.out.println("Date2 : " + objSDF.format(dt_2));

        // compareTo returns > 0 when dt_1 is after dt_2
        if (dt_1.compareTo(dt_2) > 0) {
            System.out.println("Date 1 occurs after Date 2");
        }
        // compareTo returns < 0 when dt_1 is before dt_2
        else if (dt_1.compareTo(dt_2) < 0) {
            System.out.println("Date 1 occurs before Date 2");
        }
        // compareTo returns 0 when both dates are equal
        else {
            System.out.println("Both are the same date");
        }
    }
}

Output:

Date1 : 20-08-1981
Date2 : 12-10-2012
Date 1 occurs before Date 2

Bemรฆrk: Den oprindelige kode brugte mรธnsteret dd-mm-yyyy. Smรฅ bogstaver mm Bogstavet er minut, ikke mรฅned, sรฅ parseren producerede lydlรธst den forkerte mรฅnedsvรฆrdi. Ovenstรฅende rettelse bruger store bogstaver MM for mรฅned, hvilket er det korrekte mรธnsterbogstav.

Java 8 Moderne dato og klokkeslรฆt API (java.time)

Java 8 introducerede java.time pakke, en redesignet API inspireret af Joda-Time-biblioteket. De nye klasser er uforanderlige, trรฅdsikre og adskiller den menneskelige kalender fra maskinens tidslinje. De mest almindelige typer er:

  • LocalDate for en dato uden et tidspunkt eller en zone (f.eks. en fรธdselsdag).
  • LocalTime for et vรฆgur uden dato eller zone.
  • LocalDateTime for en dato og et klokkeslรฆt uden en zone.
  • ZonedDateTime for en dato og et klokkeslรฆt med en bestemt tidszone.
  • OffsetDateTime for en dato og et klokkeslรฆt med en UTC-forskydning, men ingen navngiven zone.
  • Instant for et maskintidsstempel mรฅlt fra UNIX-epoken.
  • Duration og Period for tidsbaserede og datobaserede belรธb.

Eksemplet nedenfor udskriver den aktuelle dato, klokkeslรฆt, tidsstempel og tidszone ved hjรฆlp af den moderne API:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.time.ZoneId;

class ModernDateDemo {
    public static void main(String args[]) {
        LocalDate today = LocalDate.now();
        LocalDateTime now = LocalDateTime.now();
        ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
        Instant epoch = Instant.now();

        System.out.println("LocalDate     : " + today);
        System.out.println("LocalDateTime : " + now);
        System.out.println("ZonedDateTime : " + zoned);
        System.out.println("Instant       : " + epoch);
    }
}

Hver type har fabriksmetoder (now, of, parse) og uforanderlige operationer (plusDays, minusHours, withYear) der returnerer en ny vรฆrdi i stedet for at mutere det oprindelige objekt.

DateTimeFormatter: Formatรฉr datoer i Modern Java

DateTimeFormatter in java.time.format erstatter SimpleDateFormatDen bruger den samme stil af mรธnsterbogstaver, er uforanderlig og er sikker at dele pรฅ tvรฆrs af trรฅde uden ekstra synkronisering. Klassen eksponerer ogsรฅ fรฆrdige konstanter sรฅsom ISO_LOCAL_DATE og ISO_ZONED_DATE_TIME for standardformater.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class FormatterDemo {
    public static void main(String args[]) {
        LocalDateTime now = LocalDateTime.now();

        DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy");

        System.out.println(now.format(iso));
        System.out.println(now.format(human));

        LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso);
        System.out.println("Parsed back : " + parsed);
    }
}

For at sammenligne to datoer i den moderne API, kald isBefore, isAfter eller isEqualDisse metoder er tydeligere end compareTo og arbejde med alle java.time klasse.

Trรฅdsikkerhed og bedste praksis for Java Dato og tid

Bรฅde java.util.Date og SimpleDateFormat forud for moderne samtidighed Java, og hver af dem har kendte faldgruber. Fรธlg nedenstรฅende fremgangsmรฅder for at holde datohรฅndteringen korrekt i produktionskoden:

  • Foretrรฆk java.time frem for dato og kalender. De nye typer er uforanderlige og trรฅdsikre, og de modellerer domรฆnet mere prรฆcist (datoer uden tidspunkter, tidspunkter uden zoner osv.).
  • Del ikke et SimpleDateFormat pรฅ tvรฆrs af trรฅde. Klassen gemmer intern parse-tilstand og er ikke trรฅdsikker. Pak den ind i en ThreadLocal, synkroniser pรฅ instansen, eller skift til DateTimeFormatter.
  • Angiv altid en lokalitet. Mรฅned- og dagnavne รฆndres med JVM-standardlokaliteten, hvilket skaber mรธnstre som MMM og EEE ikke-portabel. Angiv en lokalitet eksplicit (f.eks. Locale.ENGLISH).
  • Vรฆr tydelig omkring tidszoner. LocalDateTime har ingen zone, sรฅ konverter til ZonedDateTime or Instant nรฅr det prรฆcise tidspunkt er vigtigt, isรฆr for logfiler, databasekolonner og netvรฆrksnyttelast.
  • Konverter omhyggeligt mellem de to API'er. Brug date.toInstant(), Date.from(instant)og calendar.toInstant().atZone(zone) pรฅ grรฆnsen mellem รฆldre kode og moderne kode.
  • Gem tidsstempler i UTC. Vedhold og transmit datoer som UTC (en Instant eller en ISO 8601-streng) og konverter kun til brugerzonen ved visning.

Ofte Stillede Spรธrgsmรฅl

Kald LocalDateTime.now() fra java.time-pakken for en dato og et klokkeslรฆt i systemzonen, eller LocalDate.now() kun for en dato. Pรฅ รฆldre Java, brug new java.util.Date() til at hente det aktuelle รธjeblik.

java.util.Date reprรฆsenterer et รธjeblik i millisekunder siden epoken og er foranderlig. LocalDate modellerer en kalenderdato uden et tidspunkt eller en zone, er uforanderlig og trรฅdsikker og tilbyder klarere metoder sรฅsom plusDays og isBefore.

Nej. SimpleDateFormat beholder en foranderlig parse-tilstand og producerer forkerte resultater, nรฅr den deles pรฅ tvรฆrs af trรฅde. Pak den ind i en ThreadLocal, synkroniser pรฅ instansen, eller skift til DateTimeFormatter, som er uforanderlig og sikker.

Brug den nรธjagtige streng "yyyy-MM-dd". Stor MM er mรฅned, lille mm er minut. For en fuld dato og klokkeslรฆt skal du bruge "yyyy-MM-dd HH:mm:ss". Angiv altid en lokalitet, sรฅ mรฅnedsnavne forbliver reproducerbare.

Med den traditionelle Date-metode skal du bruge compareTo, som returnerer et negativt, nul eller positivt heltal. Med java.time skal du kalde isBefore, isAfter eller isEqual pรฅ en LocalDate eller Instant. Begge tilgange respekterer kronologisk rรฆkkefรธlge.

Kald date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(). For at gรฅ tilbage, brug Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()). Vรฆlg zonen eksplicit, nรฅr det prรฆcise tidspunkt er vigtigt.

AI-modeller trรฆnet pรฅ log- og dokumentkorpora udleder det sandsynlige mรธnster fra eksempelstrenge og returnerer et matchende DateTimeFormatter-mรธnster. Maskinlรฆringsklassifikatorer markerer ogsรฅ tvetydige felter sรฅsom mรฅned-dag versus dag-mรฅned rรฆkkefรธlge.

Ja. GitHub Copilot foreslรฅr DateTimeFormatter-mรธnstre, ZonedDateTime-konverteringer og JUnit test for lokalitetsfรธlsomt output. RevSe hvert forslag for de korrekte mรธnsterbogstaver, lokalitet og tidszone, fรธr du forpligter dig.

Opsummer dette indlรฆg med: