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.

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.
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:
| Brev | Dato- eller tidskomponent | Eksempel |
|---|---|---|
| G | Epoke betegner | AD |
| y | ร r | 2026 |
| M | Mรฅned i รฅr | juli eller juli eller 07 |
| w | Uge i รฅr | 27 |
| W | Uge i mรฅned | 2 |
| D | Dag i รฅr | 189 |
| d | Dag i mรฅned | 10 |
| F | Ugedag i mรฅned | 2 |
| E | Dagens navn i ugen | tirsdag eller tirsdag |
| u | Dagnummer i ugen (1 = Monday, 7 = sรธndag) | 1 |
| a | AM- eller PM-markรธr | PM |
| H | Time om dagen (0-23) | 0 |
| k | Time om dagen (1-24) | 24 |
| K | Time i AM eller PM (0-11) | 0 |
| h | Time i AM eller PM (1-12) | 12 |
| m | Minut i time | 30 |
| s | Anden pรฅ minut | 55 |
| S | millisekund | 978 |
| z | Tidszone (navn) | Pacific Standard Time; PST; GMT-08:00 |
| Z | Tidszone (RFC 822-forskydning) | -0800 |
| X | Tidszone (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:
- Pรฅkrรฆvet datoformat: 2012.10.23 20:20:45 PSTDet passende formatmรธnster er
yyyy.MM.dd HH:mm:ss zzz. - 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
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:
LocalDatefor en dato uden et tidspunkt eller en zone (f.eks. en fรธdselsdag).LocalTimefor et vรฆgur uden dato eller zone.LocalDateTimefor en dato og et klokkeslรฆt uden en zone.ZonedDateTimefor en dato og et klokkeslรฆt med en bestemt tidszone.OffsetDateTimefor en dato og et klokkeslรฆt med en UTC-forskydning, men ingen navngiven zone.Instantfor et maskintidsstempel mรฅlt fra UNIX-epoken.DurationogPeriodfor 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 tilDateTimeFormatter. - Angiv altid en lokalitet. Mรฅned- og dagnavne รฆndres med JVM-standardlokaliteten, hvilket skaber mรธnstre som
MMMogEEEikke-portabel. Angiv en lokalitet eksplicit (f.eks.Locale.ENGLISH). - Vรฆr tydelig omkring tidszoner.
LocalDateTimehar ingen zone, sรฅ konverter tilZonedDateTimeorInstantnรฅ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)ogcalendar.toInstant().atZone(zone)pรฅ grรฆnsen mellem รฆldre kode og moderne kode. - Gem tidsstempler i UTC. Vedhold og transmit datoer som UTC (en
Instanteller en ISO 8601-streng) og konverter kun til brugerzonen ved visning.


