Java Dato og klokkeslett
โก Smart oppsummering
Java Dato- og klokkesletthรฅndtering kombinerer de eldre klassene java.util.Date og SimpleDateFormat med det moderne java.time API-et som ble introdusert i Java 8, noe som gir utviklere uforanderlige, trรฅdsikre typer for nรธyaktig kalenderarbeid.

Hรฅndtering av datoer og klokkeslett i Java er en rutinemessig del av รฅ bygge planleggingslogikk, logge tidsstempler, rapporter og revisjonsspor. Fรธr du skriver kode, er det nyttig รฅ kjenne parameterne som utgjรธr en dato:
- Ocuco รฅr (med to eller fire sifre).
- Ocuco mรฅned (som to sifre, som de tre fรธrste bokstavene i mรฅneden, eller som hele mรฅnedsnavnet).
- Ocuco data (det faktiske tallet for mรฅnedsdag).
- Ocuco dag (dagens navn pรฅ den gitte datoen, for eksempel sรธn, man, tir).
Java eksponerer mange andre parametere som beskriver et รธyeblikk pรฅ tidslinjen, inkludert รฆra, uke i รฅret, tidssone og forskyvning. Avsnittene nedenfor dekker hver av dem med kjรธrbare eksempler.
Vis dato i Java
Java gir en Date klasse i java.util pakke. Klassen lagrer et spesifikt รธyeblikk med millisekundpresisjon og tilbyr hjelpemetoder for รฅ skrive ut, sammenligne og formatere det รธyeblikket. For รฅ fรฅ gjeldende dato og klokkeslett, instansier klassen med standardkonstruktรธren:
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()); } }
Utgang:
Wed Nov 29 06:36:22 UTC 2017
Eksemplet skriver ut datoen i standard toString-formatet. For รฅ vise samme รธyeblikk i et annet mรธnster, mรฅ du fรธrst forstรฅ formateringsbokstavene som Java bruker.
SimpleDateFormat: Parse og formater datoer
Ocuco SimpleDateFormat klasse i java.text konverterer en Date objektet til en formatert streng og analyserer en formatert streng tilbake til en DateDen bruker mรธnsterbokstaver som tilordnes en dato- eller klokkeslettkomponent. Tabellen nedenfor viser alle stรธttede bokstaver:
| Brev | Dato- eller tidskomponent | Eksempel |
|---|---|---|
| G | Epoke betegner | AD |
| y | ร r | 2026 |
| M | Mรฅned i รฅr | juli eller juli eller 07 |
| w | Uke i รฅr | 27 |
| W | Uke i mรฅned | 2 |
| D | Dag i รฅr | 189 |
| d | Dag i mรฅned | 10 |
| F | ukedag i mรฅned | 2 |
| E | Dagens navn i uken | tirsdag eller tirs |
| u | Dagnummer i uken (1 = Monday, 7 = sรธndag) | 1 |
| a | AM- eller PM-markรธr | PM |
| H | Time i dรธgnet (0-23) | 0 |
| k | Time i dรธgnet (1-24) | 24 |
| K | Time i AM eller PM (0โ11) | 0 |
| h | Time i AM eller PM (1โ12) | 12 |
| m | Minutt i time | 30 |
| s | Andre pรฅ minuttet | 55 |
| S | millisekund | 978 |
| z | Tidssone (navn) | Pacific Standard Time; PST; GMT-08:00 |
| Z | Tidssone (RFC 822-forskyvning) | -0800 |
| X | Tidssone (ISO 8601-forskyvning) | -08 eller -0800 eller -08:00 |
Du trenger ikke รฅ huske hele tabellen. Bruk den hver gang du lager et nytt mรธnster.
Slik bruker du SimpleDateFormat
SimpleDateFormat er en underklasse av DateFormat som lar deg formatere og analysere datoer ved hjelp av mรธnsterbokstavene ovenfor. Kombiner bokstavene for รฅ beskrive den nรธyaktige strengen du vil produsere eller lese.
For eksempel:
- Datoformat kreves: 2012.10.23 20:20:45 PSTDet riktige formatmรธnsteret er
yyyy.MM.dd HH:mm:ss zzz. - Datoformat kreves: 09:30:00 AM 23-May-2012Det riktige formatmรธnsteret er
hh:mm:ss a dd-MMM-yyyy.
Tips: Klokkebokstav. Store bokstaver. M er mรฅned, med liten bokstav m er minutt. Store bokstaver H er en 24-timers klokke, med smรฅ bokstaver h er en 12-timers klokke. ร
blande dem gir lydlรธst feil utdata.
Programmet nedenfor skriver ut gjeldende dato to ganger, รฉn gang i standardformat og รฉn gang gjennom 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)); } }
Utgang:
Wed Nov 29 06:31:41 UTC 2017 06:31:41 AM 29-Nov-2017
Sammenlign Datoer Eksempel
Den mest pรฅlitelige mรฅten รฅ bestille to pรฅ Date objektene er compareTo() Metoden. Den returnerer et negativt heltall nรฅr innkalleren er tidligere, null nรฅr begge tidspunktene er like, og et positivt heltall nรฅr innkalleren er senere. Kodestykket nedenfor analyserer to dato-strenger og skriver ut deres relative rekkefรธ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"); } } }
Utgang:
Date1 : 20-08-1981 Date2 : 12-10-2012 Date 1 occurs before Date 2
OBS: Den opprinnelige koden brukte mรธnsteret dd-mm-yyyySmรฅ bokstaver mm bokstaven er minutt, ikke mรฅned, sรฅ parseren produserte i stillhet feil mรฅnedsverdi. Rettelsen ovenfor bruker store bokstaver MM for mรฅned, som er den riktige mรธnsterbokstaven.
Java 8 Moderne dato og klokkeslett API (java.time)
Java 8 introduserte java.time pakke, et redesignet API inspirert av Joda-Time-biblioteket. De nye klassene er uforanderlige, trรฅdsikre og skiller den menneskelige kalenderen fra maskinens tidslinje. De vanligste typene er:
LocalDatefor en dato uten tid eller sone (for eksempel en bursdag).LocalTimefor en veggklokketid uten dato eller sone.LocalDateTimefor en dato og et klokkeslett uten en sone.ZonedDateTimefor en dato og et klokkeslett med en bestemt tidssone.OffsetDateTimefor en dato og et klokkeslett med en UTC-forskyvning, men ingen navngitt sone.Instantfor et maskintidsstempel mรฅlt fra UNIX-epoken.DurationogPeriodfor tidsbaserte og datobaserte belรธp.
Eksemplet nedenfor skriver ut gjeldende dato, klokkeslett, tidsstempel og tidssone ved hjelp av det moderne API-et:
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 fabrikkmetoder (now, of, parse) og uforanderlige operasjoner (plusDays, minusHours, withYear) som returnerer en ny verdi i stedet for รฅ mutere det opprinnelige objektet.
DateTimeFormatter: Formater datoer i Modern Java
DateTimeFormatter in java.time.format erstatter SimpleDateFormatDen bruker samme stil med mรธnsterbokstaver, er uforanderlig og trygg รฅ dele pรฅ tvers av trรฅder uten ekstra synkronisering. Klassen eksponerer ogsรฅ ferdige konstanter 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 รฅ sammenligne to datoer i det moderne API-et, kall isBefore, isAftereller isEqualDisse metodene leses tydeligere enn compareTo og jobbe med alle java.time klasse.
Trรฅdsikkerhet og beste praksis for Java Dato og klokkeslett
Begge java.util.Date og SimpleDateFormat eldre enn moderne samtidighet Java, og hver av dem har kjente fallgruver. Fรธlg fremgangsmรฅtene nedenfor for รฅ holde datohรฅndteringen korrekt i produksjonskoden:
- Foretrekker java.time fremfor dato og kalender. De nye typene er uforanderlige og trรฅdsikre, og de modellerer domenet mer nรธyaktig (datoer uten klokkeslett, klokkeslett uten soner og sรฅ videre).
- Ikke del et SimpleDateFormat pรฅ tvers av trรฅder. Klassen lagrer intern parse-tilstand og er ikke trรฅdsikker. Pakk den inn i en
ThreadLocal, synkroniser pรฅ forekomsten, eller bytt tilDateTimeFormatter. - Angi alltid en sprรฅkinnstilling. Mรฅned- og dagnavn endres med standard JVM-sprรฅkinnstillingen, noe som lager mรธnstre som
MMMogEEEikke-portabel. Overfรธr en lokalitet eksplisitt (for eksempelLocale.ENGLISH). - Vรฆr tydelig om tidssoner.
LocalDateTimehar ingen sone, sรฅ konverter tilZonedDateTimeorInstantnรฅr det nรธyaktige รธyeblikket er viktig, spesielt for logger, databasekolonner og nettverksnyttelaster. - Konverter forsiktig mellom de to API-ene. Bruk
date.toInstant(),Date.from(instant)ogcalendar.toInstant().atZone(zone)pรฅ grensen mellom eldre kode og moderne kode. - Lagre tidsstempler i UTC. Vedhold og transmit datoer som UTC (en
Instanteller en ISO 8601-streng) og konvertere til brukersonen bare ved visning.


