JavaRush /Java Blog /Random-TL /Ang isang intuitive, matatag na library para sa pagtatrab...
theGrass
Antas
Саратов

Ang isang intuitive, matatag na library para sa pagtatrabaho sa mga oras at petsa ay sa wakas ay magagamit sa Java (Bahagi 2).

Nai-publish sa grupo
Mga Oras ng Araw
    Kaya't magpatuloy tayo. Ang susunod na entity pagkatapos ng petsa ay ang oras ng araw, na kinakatawan ng klase ng LocalTime . Ang isang klasikong halimbawa ay kumakatawan sa mga oras ng pagbubukas ng isang tindahan, sabihin nating mula 7:00 hanggang 23:00. Ang mga tindahan ay bukas sa oras na ito sa buong bansa, ngunit ang mga aktwal na oras ay mag-iiba depende sa time zone.     Ang LocalTime ay isang value class na nag-iimbak lamang ng oras, nang walang nauugnay na petsa o time zone. Kapag nagdaragdag o nagbawas ng isang yugto ng panahon, ito ay puputulin sa hatinggabi. Ibig sabihin, 20:00 plus 6 hours ay 2:00. Ang paggamit ng LocalTime ay katulad ng LocalDate : LocalTime time = LocalTime.of(20, 30); int hour = date.getHour(); // 20 int minute = date.getMinute(); // 30 time = time.withSecond(6); // 20:30:06 time = time.plusMinutes(3); // 20:33:06     Ang mga modifier ay maaaring gumana sa LocalTime , ngunit ang mga pagpapatakbo ng oras ay karaniwang hindi masyadong kumplikado na kinakailangan ang mga modifier.
Pinagsasama-sama ang petsa at oras
    Ang susunod na klase na titingnan natin ay LocalDateTime . Ang value class na ito ay kumbinasyon ng LocalDate at LocalTime . Kinakatawan nito ang parehong petsa at oras, na walang time zone.      Ang LocalDateTime ay maaaring gawin nang direkta o sa pamamagitan ng pagsasama-sama ng petsa at oras: LocalDateTime dt1 = LocalDateTime.of(2014, Month.JUNE, 10, 20, 30); LocalDateTime dt2 = LocalDateTime.of(date, time); LocalDateTime dt3 = date.atTime(20, 30); LocalDateTime dt4 = date.atTime(time);     Ang ikatlo at ikaapat na opsyon ay gumagamit ng atTime() na paraan , na nagbibigay ng isang nababaluktot na paraan upang pagsamahin ang petsa at oras. Karamihan sa mga klase ng sistema ng petsa at oras ay may mga pamamaraang "sa" na maaaring gamitin kapag pinagsasama ang iyong bagay sa isa pa upang lumikha ng mas kumplikado. Ang iba pang mga pamamaraan ng klase ng LocalDateTime ay katulad ng sa LocalDate at LocalTime . Ang mga pattern ng pagpapangalan ng katulad na paraan ay ginagawang mas madaling matutunan ang API . Inililista ng talahanayang ito ang lahat ng kasangkot na prefix ng pamamaraan: Ang isang intuitive, matatag na library para sa pagtatrabaho sa mga oras at petsa ay sa wakas ay magagamit sa Java (Bahagi 2).  - 1
Instant
    Kapag nakikitungo tayo sa mga petsa at oras, kadalasan ay gumagawa tayo ng mga taon, buwan, araw, oras, minuto, segundo. Gayunpaman, ito ay isa lamang modelo ng oras na maaaring tawaging "tao". Ang pangalawang modelo na karaniwang ginagamit ay "machine" o "continuous" na oras. Sa modelong ito, ang isang punto sa axis ng oras ay kinakatawan ng isang malaking numero. Pinapasimple ng diskarteng ito ang mga algorithm ng pagkalkula, at ginagamit upang mag-imbak ng oras sa operating system ng Unix , kung saan ang oras ay kinakatawan ng bilang ng mga segundo na lumipas mula noong Enero 1, 1970. Katulad nito, sa Java , ang oras ay iniimbak bilang ang bilang ng mga millisecond na lumipas mula noong Enero 1, 1970. Ang machine approach sa mga kalkulasyon ng oras sa java.time API ay ibinibigay ng Instant value class . Nagbibigay ito ng kakayahang kumatawan sa isang punto sa isang axis ng oras nang wala ang lahat ng kasamang impormasyon, tulad ng time zone. Sa katunayan, naglalaman ang klase na ito ng bilang ng mga nanosecond na lumipas mula hatinggabi noong Enero 1, 1970. Karaniwang ginagamit Instant start = Instant.now(); // произведем вычисления Instant end = Instant.now(); assert end.isAfter(start); //машина времени не сработала     ang Instant na klase upang mag-imbak at maghambing ng mga punto sa oras kung kailan kailangan mong mag-imbak kapag may nangyaring kaganapan ngunit wala kang pakialam sa time zone kung saan ito nangyari. Sa karamihan ng mga kaso, mas kawili-wili kung ano ang hindi natin magagawa sa Instant na klase kaysa sa kung ano ang magagawa natin dito. Halimbawa, ang mga sumusunod na linya ng code ay maglalagay ng mga pagbubukod: instant.get(ChronoField.MONTH_OF_YEAR); instant.plus(6, ChronoUnit.YEARS);     Nagaganap ang mga pagbubukod dahil ang instant na bagay ay nag-iimbak lamang ng bilang ng mga nanosecond at hindi nagbibigay ng kakayahang magtrabaho sa mga yunit ng oras na mas kapaki-pakinabang sa mga tao. Upang gumamit ng iba pang mga yunit ng pagsukat, dapat kang tumukoy man lang ng time zone.
Mga Time Zone
    Ang prinsipyo ng mga time zone ay binuo sa England nang ang pag-imbento ng mga riles ng tren at mga pagpapabuti sa iba pang paraan ng komunikasyon ay nagpapahintulot sa mga tao na maglakbay ng mga distansya na sapat para sa mga pagkakaiba sa solar time na maging kapansin-pansin. Hanggang sa panahong ito, ang bawat nayon at lungsod ay namuhay ayon sa sarili nitong panahon, na kadalasang sinusukat ng sundial. Ang larawang ito ay nagpapakita ng isang halimbawa ng mga paghihirap na idinulot nito - ang mga pulang kamay sa orasan ay nagpapakita ng oras ng Greenwich, at ang mga itim na kamay ay nagpapakita ng lokal na oras, na nag-iiba ng 10 minuto: Ang sistema ng time zone ay binuo, na pinapalitan ang lokal na oras ng araw Ang isang intuitive, matatag na library para sa pagtatrabaho sa mga oras at petsa ay sa wakas ay magagamit sa Java (Bahagi 2).  - 2     . Ngunit ang pangunahing katotohanan ay ang mga time zone ay nilikha ng mga pulitiko, at kadalasang ginagamit upang ipakita ang kontrol sa pulitika sa isang lugar. Tulad ng anumang patakaran, ang mga panuntunang nauugnay sa mga time zone ay madalas na sumasalungat sa lohika. At gayundin, ang mga panuntunang ito ay maaaring magbago, at madalas na magbago, nang walang anumang babala. Ang mga panuntunan sa time zone ay pinagsama-sama ng isang internasyonal na grupo na nag-publish ng IANA Time Zone Database . Naglalaman ito ng identifier ng bawat rehiyon ng Earth, at ang kasaysayan ng time zone ay nagbabago para dito. Ang mga identifier ay mukhang "Europe/London" o "America/New_York" . Bago inilabas ang java.time API , ginamit ang klase ng TimeZone upang kumatawan sa isang time zone . Ngayon ZoneId ay ginagamit sa halip . Mayroong dalawang pangunahing pagkakaiba sa pagitan nila. Una, ang ZoneId ay hindi nababago, na ginagawang posible na mag-imbak ng mga bagay ng klase na ito sa mga static na variable, bukod sa iba pang mga bagay. Pangalawa, ang mga panuntunan mismo ay nakaimbak sa ZoneRules class , at hindi sa ZoneId mismo , at para makuha ang mga ito kailangan mong tawagan ang getRules() method sa ZoneId class object . Ang isang karaniwang tampok ng lahat ng time zone ay isang nakapirming offset mula sa UTC/Greenwich . Kadalasang ginagamit mo ito kapag pinag-uusapan ang mga pagkakaiba sa oras sa pagitan ng iba't ibang lungsod, gaya ng "Ang New York ay 5 oras sa likod ng London." Ang klase ng ZoneOffset , isang inapo ng ZoneId , ay kumakatawan sa pagkakaiba ng oras sa prime meridian na dumadaan sa Greenwich sa London. Mula sa pananaw ng isang developer, mainam na hindi mo kailangang harapin ang mga time zone at ang kanilang mga kumplikado. Pinapayagan ka ng java.time API na gawin ito hangga't maaari. Hangga't maaari, gamitin ang mga klase ng LocalDate, LocalTime, LocalDateTime at Instant . Kung saan hindi mo magagawa nang walang mga time zone, gamitin ang klase ng ZonedDateTime . ZonedDateTime klase nagbibigay-daan sa iyo na i-convert ang mga petsa at oras mula sa mga yunit ng pagsukat ng tao, na nakikita namin sa mga kalendaryo at relo, sa mga unit ng makina. Bilang resulta, maaari kang lumikha ng ZonedTimeDate alinman mula sa Lokal na klase o mula sa Instant na klase : ZoneId zone = ZoneId.of("Europe/Paris"); LocalDate date = LocalDate.of(2014, Month.JUNE, 10); ZonedDateTime zdt1 = date.atStartOfDay(zone); Instant instant = Instant.now(); ZonedDateTime zdt2 = instant.atZone(zone);     Isa sa mga pinaka hindi kasiya-siyang feature ng mga time zone ay ang tinatawag na daylight saving time. Sa paglipat ng Daylight Saving Time papunta at mula sa Greenwich, ang iyong pagkakaiba sa time zone sa Greenwich ay nagbabago nang dalawang beses (o higit pa) sa isang taon, kadalasang tumataas sa tagsibol at bumababa sa taglagas. Kapag nangyari ito, kailangan nating baguhin ang lahat ng orasan sa ating bahay. Sa java.time classes , ang offset data ay kinakatawan bilang "offset transforms" . Sa tagsibol ito ay nagiging sanhi ng isang "gap" sa oras, kapag ang ilang mga halaga ng oras ay imposible, at sa taglagas, sa kabaligtaran, ang ilang mga halaga ng oras ay nangyayari nang dalawang beses. Ang lahat ng ito ay sinusuportahan ng klase ng ZonedDateTime sa pamamagitan ng mga factory method at converter method nito. Halimbawa, ang pagdaragdag ng isang araw ay nagdaragdag ng isang lohikal na araw, na maaaring katawanin ng higit o mas mababa sa 24 na oras kung lilipat tayo sa daylight saving time o pabalik. Gayundin, pinangalanan ang paraan ng atStartOfDay() dahil hindi namin magagarantiya na magsisimula ang araw nang eksakto sa hatinggabi - dapat naming isaalang-alang ang agwat ng oras kapag lumipat sa daylight saving. At isang huling tip tungkol sa daylight saving time. Kung gusto mong ipakita na naitala mo ang overlap ng oras sa panahon ng paglipat mula sa tag-araw patungo sa taglamig (kapag lumitaw ang parehong halaga ng oras nang dalawang beses), maaari mong gamitin ang isa sa dalawang espesyal na pamamaraan na idinisenyo para sa mga ganitong sitwasyon: Ibabalik ang mga pamamaraang ito sa mas maaga o mas bago. zdt = zdt.withEarlierOffsetAtOverlap(); zdt = zdt.withLaterOffsetAtOverlap();     value , kung ang bagay ay nahuli sa isang overlap sa panahon ng paglipat mula sa tag-araw hanggang sa taglamig. Sa lahat ng iba pang mga sitwasyon, ang mga halaga ng pagbabalik ay magiging pareho.
Mga agwat ng oras
    Ang lahat ng mga klase na tinalakay natin kanina ay gumagana bilang mga punto sa timeline. Dalawang karagdagang klase ng halaga ang kailangan upang kumatawan sa mga agwat ng oras. Kinakatawan ng klase ng Duration ang haba ng oras, na sinusukat sa mga segundo at nanosecond. Halimbawa, "23.6 segundo." Ang klase ng Panahon ay kumakatawan sa isang yugto ng panahon na sinusukat sa mga taon, buwan, at araw. Halimbawa - "3 taon, 2 buwan at 6 na araw." Ang mga agwat na ito ay maaaring idagdag o ibawas mula sa isang petsa o oras: Period sixMonths = Period.ofMonths(6); LocalDate date = LocalDate.now(); LocalDate future = date.plus(sixMonths);
Pag-format at pag-parse
    Ang isang buong pakete ay idinisenyo upang i-format at ipakita ang mga petsa at oras - java.time.format . Umiikot ang package sa klase ng DateTimeFormatter at sa pabrika nitong DateTimeFormatterBuilder . Ang pinakakaraniwang paraan upang lumikha ng isang formatter ay sa pamamagitan ng mga static na pamamaraan at constant sa DateTimeFormatter , kabilang ang:
  • Mga constant para sa mga karaniwang format na inilalarawan sa ISO, gaya ng ISO_LOCAL_DATE.
  • Mga pattern na natukoy sa pamamagitan ng mga titik, gaya ng ofPattern("dd/MM/uuuu").
  • Mga naka-localize na istilo gaya ng ofLocalizedDate(FormatStyle.MEDIUM).
    Kapag nakagawa ka na ng formatter, karaniwan mong ginagamit ito sa pamamagitan ng pagpasa nito sa naaangkop na paraan ng klase ng petsa: DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu"); LocalDate date = LocalDate.parse("24/06/2014", f); String str = date.format(f);     Sa ganitong paraan, ang code na responsable sa pag-format ng output ng petsa ay ihihiwalay sa isang hiwalay na klase. Kung kailangan mong hiwalay na tukuyin ang locale para sa pag-format ng petsa, gamitin ang withLocale(Locale) formatter method . Ang mga klase na responsable para sa kalendaryo, time zone, at input/output ng mga fractional na numero ay may mga katulad na pamamaraan. Kung kailangan mo ng higit pang mga pagpipilian sa fine-tuning, tingnan ang dokumentasyon para sa klase ng DateTimeFormatterBuilder , na nagbibigay-daan sa iyong lumikha ng mga kumplikadong formatter nang sunud-sunod. Nagbibigay-daan din ito sa iyo na magtakda ng case-insensitive na pag-parse ng teksto, huwag pansinin ang ilang mga error sa pag-parse, magtakda ng mga offset at mga opsyonal na elemento.
Bottom line
     Ang java.time API ay isang bagong komprehensibong modelo para sa pagtatrabaho sa petsa at oras sa Java SE 8 . Inaabot nito ang mga ideya at pagpapatupad mula sa Joda-Time sa susunod na antas at sa wakas ay nagbibigay-daan sa mga developer na maiwasan ang paggamit ng java.util.Date at Calendar . Ngayon ang pakikipagtulungan sa mga petsa at oras ay maaaring maging masaya!      Orihinal na artikulo
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION