Java Datum i vrijeme

⚡ Pametni sažetak

Java Obrada datuma i vremena kombinira naslijeđene klase java.util.Date i SimpleDateFormat s modernim java.time API-jem uvedenim u Java 8, dajući programerima nepromjenjive, niti-sigurne tipove za točan rad s kalendarom.

  • 🕒 Datum naslijeđa: Klasa java.util.Date pohranjuje trenutak u milisekundama i ispisuje zadani niz znakova putem toString.
  • 🔤 Uzorak slova: SimpleDateFormat koristi slova kao što su gggg, MM, dd, HH, mm, ss i zzz za definiranje prilagođenih izlaznih formata.
  • ⚖️ usporedba: Metoda compareTo vraća negativni, nulti ili pozitivni cijeli broj kako bi se dvije instance Date poredale kronološki.
  • 🆕 Moderni API: LocalDate, LocalDateTime, ZonedDateTime i Instant u java.time zamjenjuju Date i Calendar nepromjenjivim objektima.
  • 🧵 Sigurnost niti: DateTimeFormatter je nepromjenjiv i siguran za dijeljenje, dok SimpleDateFormat zahtijeva sinkronizaciju ili ThreadLocal omotač.
  • 🔁 Interoperabilnost: Pretvorite između starog i novog API-ja pomoću pomoćnih funkcija Date.toInstant, Date.from i Calendar.toInstant.

Java Datum i vrijeme

Obrada datuma i vremena u Java je rutinski dio izgradnje logike raspoređivanja, vremenskih oznaka zapisa, izvješća i revizijskih tragova. Prije pisanja bilo kakvog koda, korisno je znati parametre koji čine datum:

  • The godina (u dvije ili četiri znamenke).
  • The mjesec (kao dvije znamenke, kao prva tri slova mjeseca ili kao puni naziv mjeseca).
  • The podaci (stvarni broj dana u mjesecu).
  • The dan (naziv dana na zadani datum, kao što su ned, pon, uto).

Java otkriva mnoge druge parametre koji opisuju trenutak na vremenskoj crti, uključujući eru, tjedan u godini, vremensku zonu i pomak. Odjeljci u nastavku pokrivaju svaki od njih s primjerima koje je moguće pokrenuti.

Kako koristiti Datum u Java

Prikaz datuma u Java

Java osigurava Date razreda u java.util paket. Klasa pohranjuje određeni trenutak u vremenu s preciznošću od milisekunde i nudi pomoćne metode za ispis, usporedbu i formatiranje tog trenutka. Da biste dobili trenutni datum i vrijeme, instancirajte klasu s njenim zadanim konstruktorom:

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());
    }
}

Izlaz:

Wed Nov 29 06:36:22 UTC 2017

Primjer ispisuje datum u zadanom toString formatu. Za prikaz istog trenutka u drugom obrascu, prvo morate razumjeti slova formatiranja koja Java koristi.

SimpleDateFormat: Raščlanite i formatirajte datume

The SimpleDateFormat klasa u java.text pretvara Date objekt u formatirani niz i parsira formatirani niz natrag u DateKoristi uzorke slova koji se mapiraju na komponentu datuma ili vremena. Tablica u nastavku navodi sva podržana slova:

PismoKomponenta datuma ili vremenaPrimjer
GOznačivač ereAD
yGodina2026
MMjesec u godinisrpnja ili srpnja ili 07
wTjedan u godini27
WTjedan u mjesecu2
DDan u godini189
dDan u mjesecu10
FDan u tjednu u mjesecu2
ENaziv dana u tjednuUtorak ili utorak
uBroj dana u tjednu (1 = Monday, 7 = nedjelja)1
aOznaka AM ili PMPM
HSat u danu (0-23)0
kSat u danu (1-24)24
KSat u AM ili PM (0-11)0
hSat u AM ili PM (1-12)12
mMinuta u satu30
sDrugi u minuti55
Smilisekundu978
zVremenska zona (naziv)pacifičko standardno vrijeme; PST; GMT-08:00
ZVremenska zona (RFC 822 pomak)-0800
XVremenska zona (pomak prema ISO 8601)-08 ili -0800 ili -08:00

Ne morate pamtiti cijelu tablicu. Pogledajte je kad god gradite novi uzorak.

Kako koristiti SimpleDateFormat

SimpleDateFormat je podklasa od DateFormat koji vam omogućuje formatiranje i parsiranje datuma pomoću gornjih slova uzorka. Kombinirajte slova kako biste opisali točan niz koji želite generirati ili pročitati.

Na primjer:

  1. Potreban format datuma: 2012.10.23. listopada 20. u 20:45:XNUMX PSTOdgovarajući obrazac formata je yyyy.MM.dd HH:mm:ss zzz.
  2. Potreban format datuma: 09:30:00 AM 23-May-2012Odgovarajući obrazac formata je hh:mm:ss a dd-MMM-yyyy.

Savjet: Pazite na velika i mala slova. Velika slova M je mjesec, malim slovom m je minuta. Velika slova H je 24-satni sat, malim slovima h je 12-satni sat. Njihovo miješanje proizvodi tiho pogrešan izlaz.

Program u nastavku ispisuje trenutni datum dva puta, jednom u zadanom formatu i jednom putem uzorka SimpleDateFormat:

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));
    }
}

Izlaz:

Wed Nov 29 06:31:41 UTC 2017
06:31:41 AM 29-Nov-2017

Primjer usporedbe datuma

Primjer usporedbe datuma

Najpouzdaniji način za naručivanje dvaju Date objekti su compareTo() metoda. Vraća negativni cijeli broj kada je pozivatelj raniji, nulu kada su oba trenutka jednaka i pozitivan cijeli broj kada je pozivatelj kasniji. Isječak u nastavku analizira dva niza datuma i ispisuje njihov relativni redoslijed:

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");
        }
    }
}

Izlaz:

Date1 : 20-08-1981
Date2 : 12-10-2012
Date 1 occurs before Date 2

Bilješka: Izvorni kod je koristio uzorak dd-mm-yyyyMala slova mm slovo je minuta, a ne mjesec, pa je parser tiho proizveo pogrešnu vrijednost mjeseca. Gornji ispravak koristi velika slova. MM za mjesec, što je ispravan uzorak slova.

Java 8 Moderni API za datum i vrijeme (java.time)

Java 8 je uveo java.time paket, redizajnirani API inspiriran bibliotekom Joda-Time. Nove klase su nepromjenjive, sigurne za više niti i odvajaju ljudski kalendar od vremenske crte stroja. Najčešći tipovi su:

  • LocalDate za datum bez vremenske ili vremenske zone (na primjer, rođendan).
  • LocalTime za vrijeme zidnog sata bez datuma ili zone.
  • LocalDateTime za datum i vrijeme bez zone.
  • ZonedDateTime za datum i vrijeme s određenom vremenskom zonom.
  • OffsetDateTime za datum i vrijeme s UTC pomakom, ali bez imenovane zone.
  • Instant za vremensku oznaku stroja mjerenu od UNIX epohe.
  • Duration i Period za iznose temeljene na vremenu i datumu.

Primjer u nastavku ispisuje trenutni datum, vrijeme, vremensku oznaku i vremensku zonu koristeći moderni 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);
    }
}

Svaka vrsta ima tvorničke metode (now, of, parse) i nepromjenjive operacije (plusDays, minusHours, withYear) koji vraćaju novu vrijednost umjesto da mijenjaju izvorni objekt.

DateTimeFormatter: Formatiranje datuma u modernom jeziku Java

DateTimeFormatter in java.time.format zamjenjuje SimpleDateFormatKoristi isti stil uzorka slova, nepromjenjiv je i siguran za dijeljenje između niti bez dodatne sinkronizacije. Klasa također izlaže gotove konstante kao što su ISO_LOCAL_DATE i ISO_ZONED_DATE_TIME za standardne formate.

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);
    }
}

Za usporedbu dva datuma u modernom API-ju, pozovite isBefore, isAfter, ili isEqualOve metode se čitaju jasnije nego compareTo i raditi sa svakim java.time klase.

Sigurnost niti i najbolje prakse za Java Datum i vrijeme

Oboje java.util.Date i SimpleDateFormat prethode modernom istodobnom Java, i svaki ima poznate zamke. Slijedite dolje navedene postupke kako biste ispravno rukovali datumima u produkcijskom kodu:

  • Preferirajte java.time u odnosu na Date i Calendar. Novi tipovi su nepromjenjivi i sigurni za više niti te preciznije modeliraju domenu (datumi bez vremena, vremena bez zona i tako dalje).
  • Nemojte dijeliti SimpleDateFormat između niti. Klasa pohranjuje interno stanje parsiranja i nije sigurna za korištenje u više niti. Zamotajte je u ThreadLocal, sinkronizirajte na instanci ili pređite na DateTimeFormatter.
  • Uvijek navedite lokalnu postavku. Imena mjeseci i dana mijenjaju se ovisno o zadanoj lokaciji JVM-a, što stvara obrasce poput MMM i EEE neprenosivo. Izričito proslijedite lokalnu naredbu (na primjer Locale.ENGLISH).
  • Budite jasni u vezi vremenskih zona. LocalDateTime nema zonu, pa pretvori u ZonedDateTime or Instant kad god je točan trenutak važan, posebno za logove, stupce baze podataka i mrežne korisne podatke.
  • Pažljivo pretvarajte između dva API-ja. Koristiti date.toInstant(), Date.from(instant)i calendar.toInstant().atZone(zone) na granici između naslijeđenog i modernog koda.
  • Pohrani vremenske oznake u UTC-u. Ustraj i transmit datumi kao UTC (an Instant ili niz ISO 8601) i pretvoriti u korisničku zonu samo prilikom prikaza.

Pitanja i odgovori

Pozovite LocalDateTime.now() iz paketa java.time za datum i vrijeme u sistemskoj zoni ili LocalDate.now() samo za datum. Na starijim verzijama Java, koristite new java.util.Date() za dobivanje trenutnog trenutka.

java.util.Date predstavlja trenutak u milisekundama od epohe i promjenjiv je. LocalDate modelira kalendarski datum bez vremena ili zone, nepromjenjiv je i siguran za izvršavanje u više niti te nudi jasnije metode kao što su plusDays i isBefore.

Ne. SimpleDateFormat zadržava promjenjivo stanje parsiranja i daje pogrešne rezultate kada se dijeli između niti. Zamotajte ga u ThreadLocal, sinkronizirajte na instanci ili prebacite na DateTimeFormatter, koji je nepromjenjiv i siguran.

Proslijedite točan niz znakova „gggg-MM-dd“. Velika slova MM označavaju mjesec, mala slova mm označavaju minutu. Za puni datum i vrijeme koristite „gggg-MM-dd HH:mm:ss“. Uvijek navedite lokalnu postavku kako bi nazivi mjeseci ostali ponovljivi.

S naslijeđenim Dateom, koristite compareTo koji vraća negativni, nulti ili pozitivni cijeli broj. S java.time, pozovite isBefore, isAfter ili isEqual na LocalDate ili Instant. Oba pristupa poštuju kronološki redoslijed.

Pozovite date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(). Za povratak koristite Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()). Izričito odaberite zonu kad god je točan trenutak važan.

Modeli umjetne inteligencije obučeni na korpusima zapisnika i dokumenata zaključuju vjerojatni uzorak iz uzorka nizova i vraćaju odgovarajući uzorak DateTimeFormatter-a. Klasifikatori strojnog učenja također označavaju dvosmislena polja kao što je redoslijed mjesec-dan u odnosu na dan-mjesec.

Da. GitHub Copilot predlaže obrasce DateTimeFormatter, ZonedDateTime konverzije i JUnit testovi za izlaz osjetljiv na lokalizaciju. RevPrije potvrde pogledajte svaki prijedlog za ispravan uzorak slova, lokaciju i vremensku zonu.

Sažmite ovu objavu uz: