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.

  • ๐Ÿ•’ Arvsdato: java.util.Date-klassen lagrer et รธyeblikksverdi i millisekunder og skriver ut en standardstreng frem til toString.
  • ๐Ÿ”ค Mรธnsterbokstaver: SimpleDateFormat bruker bokstaver som รฅรฅรฅรฅ, MM, dd, HH, mm, ss og zzz for รฅ definere tilpassede utdataformater.
  • ๐Ÿ‡ง๐Ÿ‡ท Sammenligning: compareTo-metoden returnerer et negativt, null eller positivt heltall for รฅ ordne to Date-forekomster kronologisk.
  • ๐Ÿ†• Moderne API: LocalDate, LocalDateTime, ZonedDateTime og Instant i java.time erstatter Date og Calendar med uforanderlige objekter.
  • ๐Ÿงต Trรฅdsikkerhet: DateTimeFormatter er uforanderlig og trygg รฅ dele, mens SimpleDateFormat trenger synkronisering eller en ThreadLocal-wrapper.
  • ๐Ÿ” Interoperabilitet: Konverter mellom de gamle og nye API-ene ved hjelp av hjelperne Date.toInstant, Date.from og Calendar.toInstant.

Java Dato og klokkeslett

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.

Slik bruker du Dato i Java

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:

BrevDato- eller tidskomponentEksempel
GEpoke betegnerAD
yร…r2026
MMรฅned i รฅrjuli eller juli eller 07
wUke i รฅr27
WUke i mรฅned2
DDag i รฅr189
dDag i mรฅned10
Fukedag i mรฅned2
EDagens navn i ukentirsdag eller tirs
uDagnummer i uken (1 = Monday, 7 = sรธndag)1
aAM- eller PM-markรธrPM
HTime i dรธgnet (0-23)0
kTime i dรธgnet (1-24)24
KTime i AM eller PM (0โ€“11)0
hTime i AM eller PM (1โ€“12)12
mMinutt i time30
sAndre pรฅ minuttet55
Smillisekund978
zTidssone (navn)Pacific Standard Time; PST; GMT-08:00
ZTidssone (RFC 822-forskyvning)-0800
XTidssone (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:

  1. Datoformat kreves: 2012.10.23 20:20:45 PSTDet riktige formatmรธnsteret er yyyy.MM.dd HH:mm:ss zzz.
  2. 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

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:

  • LocalDate for en dato uten tid eller sone (for eksempel en bursdag).
  • LocalTime for en veggklokketid uten dato eller sone.
  • LocalDateTime for en dato og et klokkeslett uten en sone.
  • ZonedDateTime for en dato og et klokkeslett med en bestemt tidssone.
  • OffsetDateTime for en dato og et klokkeslett med en UTC-forskyvning, men ingen navngitt sone.
  • Instant for et maskintidsstempel mรฅlt fra UNIX-epoken.
  • Duration og Period for 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 til DateTimeFormatter.
  • Angi alltid en sprรฅkinnstilling. Mรฅned- og dagnavn endres med standard JVM-sprรฅkinnstillingen, noe som lager mรธnstre som MMM og EEE ikke-portabel. Overfรธr en lokalitet eksplisitt (for eksempel Locale.ENGLISH).
  • Vรฆr tydelig om tidssoner. LocalDateTime har ingen sone, sรฅ konverter til ZonedDateTime or Instant nรฅ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)og calendar.toInstant().atZone(zone) pรฅ grensen mellom eldre kode og moderne kode.
  • Lagre tidsstempler i UTC. Vedhold og transmit datoer som UTC (en Instant eller en ISO 8601-streng) og konvertere til brukersonen bare ved visning.

Spรธrsmรฅl og svar

Kall LocalDateTime.now() fra java.time-pakken for en dato og et klokkeslett i systemsonen, eller LocalDate.now() for bare en dato. Pรฅ eldre Java, bruk new java.util.Date() for รฅ hente gjeldende รธyeblikk.

java.util.Date representerer et รธyeblikk i millisekunder siden epoken og er foranderlig. LocalDate modellerer en kalenderdato uten tid eller sone, er uforanderlig og trรฅdsikker, og tilbyr tydeligere metoder som plusDays og isBefore.

Nei. SimpleDateFormat beholder en muterbar parse-tilstand og gir feil resultater nรฅr den deles pรฅ tvers av trรฅder. Pakk den inn i en ThreadLocal, synkroniser pรฅ instansen, eller bytt til DateTimeFormatter, som er uforanderlig og sikker.

Send inn den nรธyaktige strengen ยซyyyy-MM-ddยป. Stor MM er mรฅned, liten mm er minutt. For fullstendig dato og klokkeslett, bruk ยซyyyy-MM-dd HH:mm:ssยป. Angi alltid en sprรฅkinnstilling slik at mรฅnedsnavnene forblir reproduserbare.

Med eldre Date, bruk compareTo som returnerer et negativt, null eller positivt heltall. Med java.time, kall isBefore, isAfter eller isEqual pรฅ en LocalDate eller Instant. Begge tilnรฆrmingene respekterer kronologisk rekkefรธlge.

Kall date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(). For รฅ gรฅ tilbake, bruk Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()). Velg sonen eksplisitt nรฅr det nรธyaktige รธyeblikket er viktig.

AI-modeller trent pรฅ logg- og dokumentkorpora utleder det sannsynlige mรธnsteret fra eksempelstrenger og returnerer et samsvarende DateTimeFormatter-mรธnster. Maskinlรฆringsklassifiseringer flagger ogsรฅ tvetydige felt som mรฅned-dag versus dag-mรฅned-rekkefรธlge.

Ja. GitHub Copilot foreslรฅr DateTimeFormatter-mรธnstre, ZonedDateTime-konverteringer og JUnit tester for lokalitetssensitiv utgang. RevSe hvert forslag for riktige mรธnsterbokstaver, sted og tidssone fรธr du forplikter deg.

Oppsummer dette innlegget med: