Java Kuupäev ja aeg
⚡ Nutikas kokkuvõte
Java Kuupäeva ja kellaaja käsitlemine ühendab pärandklassid java.util.Date ja SimpleDateFormat moodsa java.time API-ga, mis võeti kasutusele aastal Java 8, pakkudes arendajatele muutmatuid ja lõimekindlaid tüüpe täpse kalendritöö jaoks.

Kuupäevade ja kellaaegade käsitlemine Java on ajastamisloogika, logide ajatemplite, aruannete ja auditeerimisradade loomise tavapärane osa. Enne mis tahes koodi kirjutamist on kasulik teada parameetreid, millest kuupäev koosneb:
- . aasta (kahe- või neljakohaline).
- . kuu (kahe numbrina, kuu esimese kolme tähena või kuu täisnimena).
- . andmed (kuu tegelik päevanumber).
- . päev (päeva nimi antud kuupäeval, näiteks P, E, T).
Java paljastab palju muid parameetreid, mis kirjeldavad ajajoone hetke, sealhulgas ajastu, nädal aastas, ajavöönd ja nihe. Allpool olevad jaotised käsitlevad neid kõiki koos käivitatavate näidetega.
Kuva kuupäev sisse Java
Java annab Date klassis java.util pakett. Klass salvestab konkreetse ajahetke millisekundilise täpsusega ja pakub abimeetodeid selle hetke printimiseks, võrdlemiseks ja vormindamiseks. Praeguse kuupäeva ja kellaaja saamiseks looge klassile selle vaikekonstruktoriga eksemplar:
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()); } }
Väljund:
Wed Nov 29 06:36:22 UTC 2017
Näide prindib kuupäeva vaikevormingus toString. Sama hetke kuvamiseks teistsuguses mustris peate kõigepealt mõistma vormindustähti, mis Java kasutab.
SimpleDateFormat: Parsi ja vorminda kuupäevi
. SimpleDateFormat klassi sisse java.text teisendab Date objekti vormindatud stringiks ja parsib vormindatud stringi tagasi stringiks DateSee kasutab mustritähti, mis vastavad kuupäeva- või kellaajakomponendile. Allolev tabel loetleb kõik toetatud tähed:
| Kiri | Kuupäeva või kellaaja komponent | Näide |
|---|---|---|
| G | Ajastu tähis | AD |
| y | Tootmisaasta | 2026 |
| M | Kuu aastas | juuli või juuli või 07 |
| w | Nädal aastas | 27 |
| W | Nädal kuus | 2 |
| D | Päev aastas | 189 |
| d | Päev kuus | 10 |
| F | Nädalapäev kuus | 2 |
| E | Päeva nimi nädalas | teisipäeval või teisipäeval |
| u | Nädala päevade arv (1 = Monday, 7 = pühapäev) | 1 |
| a | AM- või PM-marker | PM |
| H | Tund päevas (0-23) | 0 |
| k | Tund päevas (1-24) | 24 |
| K | Tund AM-is või PM-is (0–11) | 0 |
| h | Tund AM-is või PM-is (1–12) | 12 |
| m | Minut tunnis | 30 |
| s | Minuti teine | 55 |
| S | Millisekund | 978 |
| z | Ajavöönd (nimi) | Vaikse ookeani standardaeg; PST; GMT-08:00 |
| Z | Ajavöönd (RFC 822 nihe) | -0800 |
| X | Ajavöönd (ISO 8601 nihe) | -08 või -0800 või -08:00 |
Sa ei pea kogu tabelit meeles pidama. Kasuta seda alati, kui lood uue mustri.
Kuidas kasutada lihtsat kuupäevavormingut
SimpleDateFormat on alamklass DateFormat mis võimaldab teil kuupäevi vormindada ja parsida ülaltoodud mustritähtede abil. Kombineerige tähed, et kirjeldada täpset stringi, mida soovite luua või lugeda.
Näiteks:
- Nõutav kuupäevavorming: 2012.10.23 20:20:45 PSTSobiv vormingumuster on
yyyy.MM.dd HH:mm:ss zzz. - Nõutav kuupäevavorming: 09:30:00 AM 23-May-2012Sobiv vormingumuster on
hh:mm:ss a dd-MMM-yyyy.
Vihje: Suurtähtedega kell. M on kuu, väiketäht m on minut. Suurtäht H on 24-tunnine kell, väiketähtedega h on 12-tunnine kell. Nende segamini ajamine annab vaikselt vale väljundi.
Allolev programm prindib praeguse kuupäeva kaks korda, üks kord vaikevormingus ja üks kord SimpleDateFormat mustri abil:
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)); } }
Väljund:
Wed Nov 29 06:31:41 UTC 2017 06:31:41 AM 29-Nov-2017
Kuupäevade võrdlemise näide
Kõige usaldusväärsem viis kahe tellimiseks Date objektid on compareTo() meetod. See tagastab negatiivse täisarvu, kui kutsuja on varasem, nulli, kui mõlemad hetked on võrdsed, ja positiivse täisarvu, kui kutsuja on hilisem. Allolev koodilõik parsib kaks kuupäevastringi ja prindib nende suhtelise järjekorra:
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"); } } }
Väljund:
Date1 : 20-08-1981 Date2 : 12-10-2012 Date 1 occurs before Date 2
Märge: Algne kood kasutas mustrit dd-mm-yyyyVäiketähed mm täht on minut, mitte kuu, seega parser genereeris märkamatult vale kuu väärtuse. Ülaltoodud parandus kasutab suurtähti MM kuu kohta, mis on õige mustri täht.
Java 8 Kaasaegne kuupäeva ja kellaaja API (java.time)
Java 8 tutvustas java.time pakett, mis on ümberkujundatud API, mis on inspireeritud Joda-Time teegist. Uued klassid on muutumatud, lõimekindlad ja eraldavad inimese kalendri masina ajajoonest. Kõige levinumad tüübid on:
LocalDatekuupäeva jaoks, millel pole kellaaega ega vööndit (näiteks sünnipäev).LocalTimeseinakella jaoks ilma kuupäeva või tsoonita.LocalDateTimekuupäeva ja kellaaja jaoks ilma tsoonita.ZonedDateTimekuupäeva ja kellaaja jaoks kindla ajavööndiga.OffsetDateTimeUTC nihkega kuupäeva ja kellaaja jaoks, kuid ilma nimetatud tsoonita.InstantUNIX-i epohhist mõõdetud masina ajatempli jaoks.DurationjaPeriodaja- ja kuupäevapõhiste summade puhul.
Allolev näide prindib praeguse kuupäeva, kellaaja, ajatempli ja ajavööndi, kasutades moodsat API-t:
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); } }
Igal tüübil on tehasemeetodid (now, of, parse) ja muutumatud toimingud (plusDays, minusHours, withYear), mis tagastavad uue väärtuse algse objekti muteerimise asemel.
DateTimeFormatter: Kuupäevade vormindamine Modernis Java
DateTimeFormatter in java.time.format asendab SimpleDateFormatSee kasutab sama mustritähtede stiili, on muutmatu ja seda saab ohutult jagada lõimede vahel ilma täiendava sünkroniseerimiseta. Klass pakub ka valmiskonstante, näiteks ISO_LOCAL_DATE ja ISO_ZONED_DATE_TIME standardvormingute jaoks.
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); } }
Kahe kuupäeva võrdlemiseks tänapäevases API-s kutsuge isBefore, isAftervõi isEqualNeed meetodid loevad selgemini kui compareTo ja töötage igaühega java.time klass.
Lõimede ohutus ja parimad tavad Java Kuupäev ja aeg
Mõlemad java.util.Date ja SimpleDateFormat eelneb tänapäevasele samaaegsele ajale Javaja igal neist on teadaolevad lõksud. Kuupäevade korrektseks käsitlemiseks tootmiskoodis järgige alltoodud tavasid:
- Eelista java.time'i kuupäeva ja kalendri asemel. Uued tüübid on muutumatud ja lõimekindlad ning modelleerivad domeeni täpsemalt (kuupäevad ilma kellaaegadeta, kellaajad ilma tsoonideta jne).
- Ärge jagage SimpleDateFormat'i erinevate lõimede vahel. Klass salvestab sisemise parsimisoleku ja ei ole lõimekindel. Mähi see sisse
ThreadLocal, sünkroonige eksemplaris või lülitage sisseDateTimeFormatter. - Määrake alati lokaat. Kuu ja päeva nimed muutuvad vastavalt JVM-i vaikesätetele, mis muudab mustrid, näiteks
MMMjaEEEmitte-kaasaskantav. Edastage lokaal selgesõnaliselt (näiteksLocale.ENGLISH). - Olge ajavööndite osas selgesõnaline.
LocalDateTimepole tsooni, seega teisenda seeZonedDateTimeorInstantalati, kui täpne hetk on oluline, eriti logide, andmebaasiveergude ja võrgu kasulike koormuste puhul. - Teisendage kahe API vahel hoolikalt. Kasutama
date.toInstant(),Date.from(instant)jacalendar.toInstant().atZone(zone)pärandkoodi ja moodsa koodi piiril. - Salvesta ajatemplid UTC-s. Püsi ja transmit kuupäevad UTC-s (an
Instantvõi ISO 8601 string) ja teisendatakse kasutajatsooniks ainult kuvamisel.


