1. Ipinapakilala ang Date Time API

Ipinapakilala ang Date Time API

Hindi nagustuhan ng mga tagalikha ng Java ang sitwasyon sa mga klase ng Petsa at Kalendaryo. Maganda sila noong araw nila, pero nagbabago ang panahon. At isang bagay na simple, makapangyarihan at maaasahan ay naging kailangan. At sa paglabas ng Java 8 (15 taon pagkatapos Calendarlumitaw), ipinakilala ang Java Date Time API . Ito ay isang hanay ng mga klase na dapat malutas ang bawat posibleng gawain na may kinalaman sa oras.

Napakaraming klase kaya nahati sila sa ilang mga pakete:

Ang java.timepackage ay ang batayang pakete para sa Java Date Time API: naglalaman ito ng mga klase tulad ng LocalDate, LocalTime, LocalDateTime, Instant, Period, at Duration. Ang lahat ng mga bagay ng mga klase na ito ay immutable, na nangangahulugang hindi na sila mababago pagkatapos ng paglikha.

Ang java.time.formatpakete ay naglalaman ng mga klase para sa pag-format ng oras, ibig sabihin, pag-convert ng mga oras (at mga petsa) sa mga string at vice versa. Halimbawa, naglalaman ito ng maraming nalalaman DateTimeFormatterna klase, na pumapalit sa SimpleDateFormatklase.

Ang java.time.zonepackage ay naglalaman ng mga klase para sa pagtatrabaho sa mga time zone. Naglalaman ito ng mga klase tulad ng TimeZoneat ZonedDateTime. Kung nagsusulat ka ng server code para sa mga kliyenteng matatagpuan sa iba't ibang bahagi ng mundo, kakailanganin mo talaga ang mga klaseng ito.


2. LocalDateklase

Ang una at pinakakapaki-pakinabang na klase mula sa Date Time API na titingnan natin ay ang LocalDateklase. Tulad ng maaari mong hulaan mula sa pangalan nito, ang klase na ito ay idinisenyo upang gumana sa mga petsa.

Ang mga bagay ng klase na ito ay hindi nagbabago pagkatapos nilang malikha, ibig sabihin, ang LocalDateklase ay hindi nababago. Ngunit ang pag-aari na ito ay nagdaragdag ng pagiging simple at pagiging maaasahan sa klase. Lalo na kung maraming mga thread (mga thread ng pagpapatupad) ang nakikipag-ugnayan sa naturang bagay nang sabay.

Upang lumikha ng isang bagong LocalDatebagay, kailangan mong gumamit ng isa sa mga static na pamamaraan. Narito ang isang listahan ng mga pangunahing.

Pagkuha ng kasalukuyang petsa

Upang makuha ang kasalukuyang petsa, kailangan mong gamitin ang static now()na paraan. Ito ay mas madali kaysa sa tila:

LocalDate today = LocalDate.now();

Nasaan todayang LocalDatevariable, at LocalDate.now()isang tawag sa static now()na paraan ng LocalDateklase.

Halimbawa:

Code Output ng console
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Pagkuha ng petsa sa isang partikular na time zone

Ang LocalDateklase ay mayroon ding variation ng now(ZoneId)paraan na nagbibigay-daan sa iyong makuha ang kasalukuyang petsa sa isang partikular na time zone.

Para magawa ito, kailangan namin ng isa pang klase — ang ZoneIdklase (java.time.ZoneId). Mayroon itong of()paraan na nagbabalik ng isang ZoneIdbagay na binigyan ng pangalan ng time zone.

Upang matukoy ang kasalukuyang petsa sa Shanghai, kailangan mong isulat ang sumusunod na code:

Code Output ng console
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Makakahanap ka ng listahan ng mga pangalan ng lahat ng time zone sa Internet.


3. Pagkuha ng isang tiyak na petsa

Upang makakuha ng isang LocalDatebagay na kumakatawan sa isang tiyak na petsa, kailangan mong gamitin ang static of()na paraan. Ang lahat dito ay napakasimple at malinaw din:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Nasaan dateang LocalDatevariable, at isang tawag sa static na paraan ng klase.LocalDate.of()of()LocalDate

Dito makikita natin ang FEBRUARYpare-pareho ng Monthklase (java.time.Month) na ginagamit upang tukuyin ang Pebrero bilang buwan.

Maaari mo ring tiyakin ang buwan sa lumang paraan — gamit ang isang numero:

LocalDate date = LocalDate.of(2019, 2, 22);

Dalawa? Sa halip na Pebrero? Nangangahulugan ba iyon na ang mga buwan ay muling binibilang mula sa isa?

Oo, halos 20 taon pagkatapos ng paglikha ng Java, ang mga buwan ay huminto sa pagbilang mula sa zero.

Halimbawa:

Code Output ng console
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Pagkuha ng petsa ayon sa index ng araw

May isa pang kawili-wiling paraan upang lumikha ng petsa: gamit ang ofYearDaypamamaraan, maaari kang makakuha ng petsa batay lamang sa bilang ng taon at index ng araw sa taon. Narito ang pangkalahatang hitsura:

LocalDate date = LocalDate.ofYearDay(year, day);

Nasaan yearang bilang ng taon at dayang index ng araw sa taon.

Halimbawa:

Code Output ng console
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

Ang ika-100 araw ng 2019 ay ika-10 ng Abril.

Pagkuha ng Unix date

Naaalala mo ba na Dateang mga bagay ay palaging nag-iimbak ng oras bilang bilang ng mga millisecond mula noong Enero 1, 1970? Upang matiyak na hindi palalampasin ng mga programmer ang magandang lumang araw, ang LocalDateklase ay nakakuha ng isang ofEpochDay()paraan, na nagbabalik ng petsa na nakalkula mula sa Enero 1, 1970. Narito ang pangkalahatang hitsura:

LocalDate date = LocalDate.ofEpochDay(day);

Saan dayang bilang ng mga araw na lumipas mula noong Enero 1, 1970.

Halimbawa:

Code Output ng console
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Pagkuha ng mga elemento ng isang petsa

Imposibleng baguhin LocalDateang mga bagay, ngunit maaari kang makakuha ng mga indibidwal na elemento ng nakaimbak na petsa. LocalDateAng mga bagay ay may ilang mga pamamaraan para dito:

Pamamaraan Paglalarawan
int getYear()
Ibinabalik ang taon ng isang partikular na petsa
Month getMonth()
Ibinabalik ang buwan ng petsa: isa sa ilang mga constant
JANUARY, FEBRUARY, ...;
int getMonthValue()
Ibinabalik ang index ng buwan ng petsa. Enero == 1.
int getDayOfMonth()
Ibinabalik ang index ng araw ng buwan
int getDayOfYear()
Ibinabalik ang index ng araw mula sa simula ng taon
DayOfWeek getDayOfWeek()
Ibinabalik ang araw ng linggo: isa sa ilang mga constant
MONDAY, TUESDAY, ...;
IsoEra getEra()
Ibinabalik ang panahon: alinman sa BCE(Before Current Era) at CE(Current Era)

Halimbawa:

Code Output ng console
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

5. Pagbabago ng petsa sa isang LocalDatebagay

Naglalaman ang LocalDateklase ng ilang paraan na nagbibigay-daan sa iyong magtrabaho sa mga petsa. Ang pagpapatupad ng mga pamamaraan na ito ay kahalintulad sa mga pamamaraan ng Stringklase: hindi nila binabago ang umiiral LocalDatena bagay, ngunit sa halip ay nagbabalik ng bago na may nais na data.

Narito ang mga pamamaraan ng LocalDateklase:

Pamamaraan Paglalarawan
plusDays(int days)
Nagdaragdag ng tinukoy na bilang ng mga araw sa petsa
plusWeeks(int weeks)
Nagdaragdag ng mga linggo sa petsa
plusMonths(int months)
Nagdaragdag ng mga buwan sa petsa
plusYears(int years)
Nagdaragdag ng mga taon sa petsa
minusDays(int days)
Ibinabawas ang mga araw mula sa petsa
minusWeeks(int weeks)
Ibinabawas ang mga linggo mula sa petsa
minusMonths(int months)
Ibinabawas ang mga buwan mula sa petsa
minusYears(int years)
Ibinabawas ang mga taon mula sa petsa

Halimbawa:

Code Output ng console
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Ang birthday objecttinatawag nating mga pamamaraan ay hindi nagbabago. Sa halip, ang mga pamamaraan nito ay nagbabalik ng mga bagong bagay na naglalaman ng nais na data.