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.

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.
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:
| Pismo | Komponenta datuma ili vremena | Primjer |
|---|---|---|
| G | Oznaฤivaฤ ere | AD |
| y | Godina | 2026 |
| M | Mjesec u godini | srpnja ili srpnja ili 07 |
| w | Tjedan u godini | 27 |
| W | Tjedan u mjesecu | 2 |
| D | Dan u godini | 189 |
| d | Dan u mjesecu | 10 |
| F | Dan u tjednu u mjesecu | 2 |
| E | Naziv dana u tjednu | Utorak ili utorak |
| u | Broj dana u tjednu (1 = Monday, 7 = nedjelja) | 1 |
| a | Oznaka AM ili PM | PM |
| H | Sat u danu (0-23) | 0 |
| k | Sat u danu (1-24) | 24 |
| K | Sat u AM ili PM (0-11) | 0 |
| h | Sat u AM ili PM (1-12) | 12 |
| m | Minuta u satu | 30 |
| s | Drugi u minuti | 55 |
| S | milisekundu | 978 |
| z | Vremenska zona (naziv) | pacifiฤko standardno vrijeme; PST; GMT-08:00 |
| Z | Vremenska zona (RFC 822 pomak) | -0800 |
| X | Vremenska 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:
- Potreban format datuma: 2012.10.23. listopada 20. u 20:45:XNUMX PSTOdgovarajuฤi obrazac formata je
yyyy.MM.dd HH:mm:ss zzz. - 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
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:
LocalDateza datum bez vremenske ili vremenske zone (na primjer, roฤendan).LocalTimeza vrijeme zidnog sata bez datuma ili zone.LocalDateTimeza datum i vrijeme bez zone.ZonedDateTimeza datum i vrijeme s odreฤenom vremenskom zonom.OffsetDateTimeza datum i vrijeme s UTC pomakom, ali bez imenovane zone.Instantza vremensku oznaku stroja mjerenu od UNIX epohe.DurationiPeriodza 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 naDateTimeFormatter. - Uvijek navedite lokalnu postavku. Imena mjeseci i dana mijenjaju se ovisno o zadanoj lokaciji JVM-a, ลกto stvara obrasce poput
MMMiEEEneprenosivo. Izriฤito proslijedite lokalnu naredbu (na primjerLocale.ENGLISH). - Budite jasni u vezi vremenskih zona.
LocalDateTimenema zonu, pa pretvori uZonedDateTimeorInstantkad 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)icalendar.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
Instantili niz ISO 8601) i pretvoriti u korisniฤku zonu samo prilikom prikaza.


