Java Datum och tid
โก Smart sammanfattning
Java Datum- och tidshantering kombinerar de รคldre klasserna java.util.Date och SimpleDateFormat med det moderna java.time API som introducerades i Java 8, vilket ger utvecklare ofรถrรคnderliga, trรฅdsรคkra typer fรถr korrekt kalenderarbete.

Hantera datum och tider i Java รคr en rutinmรคssig del av att bygga schemalรคggningslogik, logga tidsstรคmplar, rapporter och revisionsloggar. Innan du skriver nรฅgon kod รคr det bra att kรคnna till de parametrar som utgรถr ett datum:
- Ocuco-landskapet รฅr (med tvรฅ eller fyra siffror).
- Ocuco-landskapet mรฅnad (som tvรฅ siffror, som de tre fรถrsta bokstรคverna i mรฅnaden eller som hela mรฅnadens namn).
- Ocuco-landskapet datum (det faktiska numret fรถr mรฅnadens dag).
- Ocuco-landskapet dag (dagens namn vid det angivna datumet, till exempel sรถn, mรฅn, tis).
Java exponerar mรฅnga andra parametrar som beskriver ett รถgonblick pรฅ tidslinjen, inklusive era, vecka/รฅr, tidszon och offset. Avsnitten nedan tรคcker var och en av dem med kรถrbara exempel.
Visa datum in Java
Java tillhandahรฅller en Date klass i java.util paket. Klassen lagrar ett specifikt tidpunkt med millisekunds precision och erbjuder hjรคlpmetoder fรถr att skriva ut, jรคmfรถra och formatera det tidpunkten. Fรถr att hรคmta aktuellt datum och tid, instansiera klassen med dess standardkonstruktor:
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()); } }
Produktion:
Wed Nov 29 06:36:22 UTC 2017
Exemplet skriver ut datumet i standardformatet toString. Fรถr att visa samma tidpunkt i ett annat mรถnster mรฅste du fรถrst fรถrstรฅ formateringsbokstรคverna som Java anvรคnder.
SimpleDateFormat: Analysera och formatera datum
Ocuco-landskapet SimpleDateFormat klass i java.text konverterar en Date objekt till en formaterad strรคng och tolkar en formaterad strรคng tillbaka till en DateDen anvรคnder mรถnsterbokstรคver som mappas till en datum- eller tidskomponent. Tabellen nedan listar alla bokstรคver som stรถds:
| Brev | Datum eller Tidskomponent | Exempelvis |
|---|---|---|
| G | Era betecknare | AD |
| y | ร r | 2026 |
| M | Mรฅnad i รฅr | juli eller juli eller 07 |
| w | Vecka i รฅr | 27 |
| W | Vecka i mรฅnad | 2 |
| D | Dag i รฅr | 189 |
| d | Dag i mรฅnad | 10 |
| F | Veckodag i mรฅnad | 2 |
| E | Dagens namn i veckan | tisdag eller tis |
| u | Dagnummer i veckan (1 = Monday, 7 = sรถndag) | 1 |
| a | AM- eller PM-markรถr | PM |
| H | Timme pรฅ dygnet (0-23) | 0 |
| k | Timme pรฅ dygnet (1-24) | 24 |
| K | Timme i AM eller PM (0-11) | 0 |
| h | Timme i AM eller PM (1-12) | 12 |
| m | Minut i timme | 30 |
| s | Tvรฅa pรฅ minuten | 55 |
| S | millisekund | 978 |
| z | Tidszon (namn) | Pacific Standard Time; PST; GMT-08:00 |
| Z | Tidszon (RFC 822-fรถrskjutning) | -0800 |
| X | Tidszon (ISO 8601-fรถrskjutning) | -08 eller -0800 eller -08:00 |
Du behรถver inte komma ihรฅg hela tabellen. Anvรคnd den varje gรฅng du skapar ett nytt mรถnster.
Hur man anvรคnder SimpleDateFormat
SimpleDateFormat รคr en underklass av DateFormat som lรฅter dig formatera och analysera datum med hjรคlp av bokstรคverna ovan. Kombinera bokstรคverna fรถr att beskriva exakt den strรคng du vill producera eller lรคsa.
Till exempel:
- Datumformat krรคvs: 2012.10.23 20:20:45 PSTDet lรคmpliga formatmรถnstret รคr
yyyy.MM.dd HH:mm:ss zzz. - Datumformat krรคvs: 09:30:00 AM 23-May-2012Det lรคmpliga formatmรถnstret รคr
hh:mm:ss a dd-MMM-yyyy.
Dricks: Bokstav i klockan. Versaler M รคr mรฅnad, gemener m รคr minut. Stor bokstav H รคr en 24-timmarsklocka, gemener h รคr en 12-timmarsklocka. Att blanda ihop dem producerar tyst felaktig utdata.
Programmet nedan skriver ut aktuellt datum tvรฅ gรฅnger, en gรฅng i standardformat och en gรฅng genom ett 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)); } }
Produktion:
Wed Nov 29 06:31:41 UTC 2017 06:31:41 AM 29-Nov-2017
Jรคmfรถr datum exempel
Det mest pรฅlitliga sรคttet att bestรคlla tvรฅ Date fรถremรฅlen รคr compareTo() Metoden. Den returnerar ett negativt heltal nรคr anroparen รคr tidigare, noll nรคr bรฅda tidpunkterna รคr lika och ett positivt heltal nรคr anroparen รคr senare. Kodfragmentet nedan analyserar tvรฅ datumstrรคngar och skriver ut deras relativa ordning:
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"); } } }
Produktion:
Date1 : 20-08-1981 Date2 : 12-10-2012 Date 1 occurs before Date 2
Obs: Den ursprungliga koden anvรคnde mรถnstret dd-mm-yyyy. Smรฅ bokstรคver mm bokstaven รคr minut, inte mรฅnad, sรฅ parsern producerade tyst fel mรฅnadsvรคrde. ร
tgรคrden ovan anvรคnder versaler MM fรถr mรฅnad, vilket รคr den korrekta mรถnsterbokstaven.
Java 8 Modernt datum och tid API (java.time)
Java 8 introducerade java.time paket, ett omdesignat API inspirerat av Joda-Time-biblioteket. De nya klasserna รคr ofรถrรคnderliga, trรฅdsรคkra och separerar den mรคnskliga kalendern frรฅn maskinens tidslinje. De vanligaste typerna รคr:
LocalDatefรถr ett datum utan tid eller zon (till exempel en fรถdelsedag).LocalTimefรถr en vรคggklocka utan datum eller zon.LocalDateTimefรถr ett datum och en tid utan zon.ZonedDateTimefรถr ett datum och en tid med en specifik tidszon.OffsetDateTimefรถr ett datum och en tid med en UTC-fรถrskjutning men ingen namngiven zon.Instantfรถr en maskintidsstรคmpel mรคtt frรฅn UNIX-epoken.DurationochPeriodfรถr tidsbaserade och datumbaserade belopp.
Exemplet nedan skriver ut aktuellt datum, tid, tidsstรคmpel och tidszon med hjรคlp av det moderna 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); } }
Varje typ har fabriksmetoder (now, of, parse) och ofรถrรคnderliga operationer (plusDays, minusHours, withYear) som returnerar ett nytt vรคrde istรคllet fรถr att mutera det ursprungliga objektet.
DateTimeFormatter: Formatera datum i Modern Java
DateTimeFormatter in java.time.format ersรคtter SimpleDateFormatDen anvรคnder samma stil av mรถnsterbokstรคver, รคr ofรถrรคnderlig och sรคker att dela mellan trรฅdar utan extra synkronisering. Klassen exponerar ocksรฅ fรคrdiga konstanter som ISO_LOCAL_DATE och ISO_ZONED_DATE_TIME fรถr standardformat.
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); } }
Fรถr att jรคmfรถra tvรฅ datum i det moderna API:et, anropa isBefore, isAfter, eller isEqualDessa metoder รคr tydligare รคn compareTo och arbeta med alla java.time klass.
Trรฅdsรคkerhet och bรคsta praxis fรถr Java Datum och tid
Bรฅde java.util.Date och SimpleDateFormat fรถregรฅr modern samtidighet Java, och var och en har kรคnda fallgropar. Fรถlj metoderna nedan fรถr att hรฅlla datumhanteringen korrekt i produktionskoden:
- Fรถredra java.time framfรถr Datum och Kalender. De nya typerna รคr ofรถrรคnderliga och trรฅdsรคkra, och de modellerar domรคnen mer exakt (datum utan tider, tider utan zoner och sรฅ vidare).
- Dela inte ett SimpleDateFormat mellan trรฅdar. Klassen lagrar intern parsningsstatus och รคr inte trรฅdsรคker. Slรฅ in den i en
ThreadLocal, synkronisera pรฅ instansen eller vรคxla tillDateTimeFormatter. - Ange alltid en sprรฅkinstรคllning. Mรฅnads- och dagsnamn รคndras med JVM:s standardsprรฅk, vilket skapar mรถnster som
MMMochEEEicke-portabel. Skicka en sprรฅkinstรคllning explicit (till exempelLocale.ENGLISH). - Var tydlig med tidszoner.
LocalDateTimehar ingen zon, sรฅ konvertera tillZonedDateTimeorInstantnรคrhelst det exakta รถgonblicket รคr viktigt, sรคrskilt fรถr loggar, databaskolumner och nรคtverksnyttolaster. - Konvertera noggrant mellan de tvรฅ API:erna. Anvรคnda
date.toInstant(),Date.from(instant)ochcalendar.toInstant().atZone(zone)i grรคnslandet mellan รคldre kod och modern kod. - Lagra tidsstรคmplar i UTC. Fortsรคtt och transmit datum som UTC (en
Instanteller en ISO 8601-strรคng) och konvertera endast till anvรคndarzonen vid visning.


