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.

  • ๐Ÿ•’ ร„ldre datum: Klassen java.util.Date lagrar ett รถgonblick i millisekunder och skriver ut en standardstrรคng till och med toString.
  • ๐Ÿ”ค Mรถnsterbokstรคver: SimpleDateFormat anvรคnder bokstรคver som yyyy, MM, dd, HH, mm, ss och zzz fรถr att definiera anpassade utdataformat.
  • โš–๏ธ Jรคmfรถrelse: Metoden compareTo returnerar ett negativt, noll eller positivt heltal fรถr att ordna tvรฅ Date-instanser kronologiskt.
  • ๐Ÿ†• Modernt API: LocalDate, LocalDateTime, ZonedDateTime och Instant i java.time ersรคtter Date och Calendar med ofรถrรคnderliga objekt.
  • ๐Ÿงต Trรฅdsรคkerhet: DateTimeFormatter รคr ofรถrรคnderlig och sรคker att dela, medan SimpleDateFormat behรถver synkronisering eller en ThreadLocal-omslag.
  • ๐Ÿ” interoperabilitet: Konvertera mellan de gamla och nya API:erna med hjรคlp av Date.toInstant-, Date.from- och Calendar.toInstant-hjรคlpverktygen.

Java Datum och tid

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.

Hur man anvรคnder Date in Java

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:

BrevDatum eller TidskomponentExempelvis
GEra betecknareAD
yร…r2026
MMรฅnad i รฅrjuli eller juli eller 07
wVecka i รฅr27
WVecka i mรฅnad2
DDag i รฅr189
dDag i mรฅnad10
FVeckodag i mรฅnad2
EDagens namn i veckantisdag eller tis
uDagnummer i veckan (1 = Monday, 7 = sรถndag)1
aAM- eller PM-markรถrPM
HTimme pรฅ dygnet (0-23)0
kTimme pรฅ dygnet (1-24)24
KTimme i AM eller PM (0-11)0
hTimme i AM eller PM (1-12)12
mMinut i timme30
sTvรฅa pรฅ minuten55
Smillisekund978
zTidszon (namn)Pacific Standard Time; PST; GMT-08:00
ZTidszon (RFC 822-fรถrskjutning)-0800
XTidszon (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:

  1. Datumformat krรคvs: 2012.10.23 20:20:45 PSTDet lรคmpliga formatmรถnstret รคr yyyy.MM.dd HH:mm:ss zzz.
  2. 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

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:

  • LocalDate fรถr ett datum utan tid eller zon (till exempel en fรถdelsedag).
  • LocalTime fรถr en vรคggklocka utan datum eller zon.
  • LocalDateTime fรถr ett datum och en tid utan zon.
  • ZonedDateTime fรถr ett datum och en tid med en specifik tidszon.
  • OffsetDateTime fรถr ett datum och en tid med en UTC-fรถrskjutning men ingen namngiven zon.
  • Instant fรถr en maskintidsstรคmpel mรคtt frรฅn UNIX-epoken.
  • Duration och Period fรถ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 till DateTimeFormatter.
  • Ange alltid en sprรฅkinstรคllning. Mรฅnads- och dagsnamn รคndras med JVM:s standardsprรฅk, vilket skapar mรถnster som MMM och EEE icke-portabel. Skicka en sprรฅkinstรคllning explicit (till exempel Locale.ENGLISH).
  • Var tydlig med tidszoner. LocalDateTime har ingen zon, sรฅ konvertera till ZonedDateTime or Instant nรค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)och calendar.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 Instant eller en ISO 8601-strรคng) och konvertera endast till anvรคndarzonen vid visning.

Vanliga frรฅgor

Anropa LocalDateTime.now() frรฅn java.time-paketet fรถr datum och tid i systemzonen, eller LocalDate.now() endast fรถr datum. Pรฅ รคldre Java, anvรคnd new java.util.Date() fรถr att hรคmta aktuellt tidpunkt.

java.util.Date representerar ett tidpunkt i millisekunder sedan epoken och รคr fรถrรคnderlig. LocalDate modellerar ett kalenderdatum utan tid eller zon, รคr ofรถrรคnderlig och trรฅdsรคker, och erbjuder tydligare metoder som plusDays och isBefore.

Nej. SimpleDateFormat behรฅller ett fรถrรคnderligt parsningstillstรฅnd och ger fel resultat nรคr det delas mellan trรฅdar. Slรฅ in det i en ThreadLocal, synkronisera pรฅ instansen eller vรคxla till DateTimeFormatter, vilket รคr ofรถrรคnderligt och sรคkert.

Skicka in den exakta strรคngen "yyyy-MM-dd". Stor bokstav MM รคr mรฅnad, liten bokstav mm รคr minut. Fรถr ett fullstรคndigt datum och tid, anvรคnd "yyyy-MM-dd HH:mm:ss". Ange alltid en sprรฅkinstรคllning sรฅ att mรฅnadsnamnen fรถrblir reproducerbara.

Med รคldre Date, anvรคnd compareTo som returnerar ett negativt, noll eller positivt heltal. Med java.time, anropa isBefore, isAfter eller isEqual pรฅ en LocalDate eller Instant. Bรฅda metoderna respekterar kronologisk ordning.

Anropa date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(). Fรถr att gรฅ tillbaka, anvรคnd Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()). Vรคlj zonen explicit nรคrhelst det exakta รถgonblicket รคr viktigt.

AI-modeller som trรคnas pรฅ logg- och dokumentkorpus hรคrleder det sannolika mรถnstret frรฅn exempelstrรคngar och returnerar ett matchande DateTimeFormatter-mรถnster. Maskininlรคrningsklassificerare flaggar ocksรฅ tvetydiga fรคlt som mรฅnad-dag kontra dag-mรฅnad-ordning.

Ja. GitHub Copilot fรถreslรฅr DateTimeFormatter-mรถnster, ZonedDateTime-konverteringar och JUnit tester fรถr lokalkรคnslig utdata. RevVisa varje fรถrslag fรถr korrekta mรถnsterbokstรคver, sprรฅk och tidszon innan du bestรคmmer dig.

Sammanfatta detta inlรคgg med: