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.

  • 🕒 Pärandi kuupäev: Klass java.util.Date salvestab hetke millisekundites ja prindib vaikesõne läbi toString funktsiooni.
  • 🔤 Mustri tähed: SimpleDateFormat kasutab kohandatud väljundvormingute määratlemiseks tähti nagu aaaa, KK, pp, HH, mm, ss ja zzz.
  • 🇧🇷 Võrdlus: Meetod compareTo tagastab negatiivse, nulli või positiivse täisarvu, et järjestada kaks kuupäeva eksemplari kronoloogilises järjekorras.
  • 🆕 Kaasaegne API: LocalDate, LocalDateTime, ZonedDateTime ja Instant failis java.time asendavad Date ja Calendar muutumatute objektidega.
  • 🧵 Keerme ohutus: DateTimeFormatter on muutmatu ja jagamiseks ohutu, samas kui SimpleDateFormat vajab sünkroniseerimist või ThreadLocal ümbrist.
  • 🔁 Koostalitlusvõime: Teisenda vana ja uue API vahel, kasutades abimehi Date.toInstant, Date.from ja Calendar.toInstant.

Java Kuupäev ja aeg

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.

Kuidas kasutada kuupäeva Java

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:

KiriKuupäeva või kellaaja komponentNäide
GAjastu tähisAD
yTootmisaasta2026
MKuu aastasjuuli või juuli või 07
wNädal aastas27
WNädal kuus2
DPäev aastas189
dPäev kuus10
FNädalapäev kuus2
EPäeva nimi nädalasteisipäeval või teisipäeval
uNädala päevade arv (1 = Monday, 7 = pühapäev)1
aAM- või PM-markerPM
HTund päevas (0-23)0
kTund päevas (1-24)24
KTund AM-is või PM-is (0–11)0
hTund AM-is või PM-is (1–12)12
mMinut tunnis30
sMinuti teine55
SMillisekund978
zAjavöönd (nimi)Vaikse ookeani standardaeg; PST; GMT-08:00
ZAjavöönd (RFC 822 nihe)-0800
XAjavöö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:

  1. Nõutav kuupäevavorming: 2012.10.23 20:20:45 PSTSobiv vormingumuster on yyyy.MM.dd HH:mm:ss zzz.
  2. 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

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:

  • LocalDate kuupäeva jaoks, millel pole kellaaega ega vööndit (näiteks sünnipäev).
  • LocalTime seinakella jaoks ilma kuupäeva või tsoonita.
  • LocalDateTime kuupäeva ja kellaaja jaoks ilma tsoonita.
  • ZonedDateTime kuupäeva ja kellaaja jaoks kindla ajavööndiga.
  • OffsetDateTime UTC nihkega kuupäeva ja kellaaja jaoks, kuid ilma nimetatud tsoonita.
  • Instant UNIX-i epohhist mõõdetud masina ajatempli jaoks.
  • Duration ja Period aja- 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 sisse DateTimeFormatter.
  • Määrake alati lokaat. Kuu ja päeva nimed muutuvad vastavalt JVM-i vaikesätetele, mis muudab mustrid, näiteks MMM ja EEE mitte-kaasaskantav. Edastage lokaal selgesõnaliselt (näiteks Locale.ENGLISH).
  • Olge ajavööndite osas selgesõnaline. LocalDateTime pole tsooni, seega teisenda see ZonedDateTime or Instant alati, 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)ja calendar.toInstant().atZone(zone) pärandkoodi ja moodsa koodi piiril.
  • Salvesta ajatemplid UTC-s. Püsi ja transmit kuupäevad UTC-s (an Instant või ISO 8601 string) ja teisendatakse kasutajatsooniks ainult kuvamisel.

KKK

Kuupäeva ja kellaaja saamiseks süsteemitsoonis kutsu paketist java.time välja funktsioon LocalDateTime.now() või ainult kuupäeva saamiseks funktsioon LocalDate.now(). Vanemate versioonide puhul Java, kasutage praeguse hetke saamiseks funktsiooni new java.util.Date().

java.util.Date tähistab hetke millisekundites alates epohhist ja on muudetav. LocalDate modelleerib kalendrikuupäeva ilma kellaaja või tsoonita, on muutmatu ja lõimekindel ning pakub selgemaid meetodeid nagu plusDays ja isBefore.

Ei. SimpleDateFormat hoiab parsimisolekut muudetavat ja annab lõimede vahel jagamisel valesid tulemusi. Mähi see ThreadLocali sisse, sünkroniseeri eksemplaris või lülitu DateTimeFormatterile, mis on muutmatu ja turvaline.

Edastage täpne string „aaaa-KK-pp“. Suur KK tähistab kuud, väike MM on minut. Täieliku kuupäeva ja kellaaja jaoks kasutage „aaaa-KK-pp HH:mm:ss“. Määrake alati lokaat, et kuude nimed oleksid korratavad.

Pärandkuupäeva puhul kasutage funktsiooni compareTo, mis tagastab negatiivse, nulli või positiivse täisarvu. Funktsiooni java.time korral kutsuge funktsiooni isBefore, isAfter või isEqual välja LocalDate'i või Instanti puhul. Mõlemad lähenemisviisid järgivad kronoloogilist järjekorda.

Kasuta funktsiooni date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(). Tagasiliikumiseks kasuta funktsiooni Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()). Vali tsoon selgesõnaliselt alati, kui täpne hetk on oluline.

Logi- ja dokumendikorpustel treenitud tehisintellekti mudelid järeldavad näidisstringidest tõenäolise mustri ja tagastavad vastava DateTimeFormatter-mustri. Masinõppe klassifikaatorid märgistavad ka mitmetähenduslikke välju, näiteks kuu-päev versus päev-kuu järjekord.

Jah. GitHub Copilot soovitab DateTimeFormatteri mustreid, ZonedDateTime teisendusi ja JUnit testib lokaalitundlikku väljundit. RevEnne kinnitamist vaadake iga soovitust õigete mustritähtede, lokaadi ja ajavööndi kohta.

Võta see postitus kokku järgmiselt: