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: