Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Vremenske zone

Sve Local* klase koje smo posmatrali poslednji put ignorišu kompleksnost koju uvode vremenske zone. Vremenske tone su skup pravila koja odgovaraju oblastima gde je standardno vreme isto, i ima ih oko 40. Svaka vremenska zona ima odstupanja od UTC-a , tako da se njegovo vreme pomera u sync sa UTC, ali postoje razlike. Nažalost, definisana odstupanja od UTC -a mogu varirati usled promena u pravilima. Vremenske zone imaju dva različita identifikatora: skraćeni, tj. "PLT", i duži, tj. "Asia/Karachi".

Odstupanje u vremenskoj zoni je period vremena u kome se vremenska zona razlikuje od vremena Greenwich/UTC. Odstupanja u vremenskoj zoni mogu biti rešena u određenom trenutku. Na primer, leti Pariz je po Greenwich/UTC + jedan sat. Zimi, je Greenwich/UTC + dva sata. Ne morate da budete svesni svih detalja, jer JSR-310 ovo izdvaja za vas, ali treba da razumete osnovni koncept, da ne postoji mapiranje jedan na jedan između odstupanja i vremenskih zona. Kada kreirate svoju aplikaciju, trebalo bi da razmotrite koji je scenario podesan za upotrebu vremenskih zona, i kada su odstupanja prikladna.

Klase vremenskih zona

Postoji veliki broj klasa koje predstavljaju delove sistema vremenskih zona. Sve ove klase su zasnovane na oblastima, što će reći da se mogu potražiti po podoblastima, kao što su Day, Second ili ZoneOffset.

  • ZonedDateTime - datum i vreme sa potpuno kvalifikovanom vremenskom zonom. Ovo može rešiti odstupanja u bilo kom trenutku. Opšte pravilo je da ako želite da predstavite datum i vreme, bez oslanjanja na kontekst određenog servera, tada bi trebalo da koristite ZonedDateTime.

  • OffsetTime - vreme sa rešenim odstupanjem.

  • OffsetDate - datum sa rešenim odstupanjem.

  • OffsetDateTime - datum i vreme sa rešenim odstupanjem. Ovo je korisno za serijalizaciju baze podataka, o kojoj će se diskutovati niže, a takođe može biti korišćeno kao format za serijalizaciju logovanja vremenskih oznaka, ukoliko imate server sa drugačijim vremenskim zonama.

Postoje takođe klase za oblikovanje određenih koncepata u okviru domena vremenskih zona.

  • ZoneId - identifikator oblasti. Svaki ZoneId odgovara nekim pravilima koje vremenska zona definiše za tu oblast. Kada projektujete svoj softver, ako razmotrite razbacivanje String-a kao što su "PLT" ili "Asia/Karachi", onda bi trebalo da umesto toga koristite ovaj domen klase. Na primer, čuvanje korisničkih preferenci za svoju vremensku zonu.

  • ZoneOffset - vremenski period koji odgovara razlici između Greenwich/UTC i vremenske zone. Ovo može biti rešeno za određeni ZoneId u određenom trenutku.

API

Api konvencije, koje su bile navedene za Local* klase, takođe su prisutne za oblasti koje su zasnovane na vremenskim zonama. To uključuje:

Kreiranje objekta upotrebom fabričkog metoda koji počinje sa 'of', 'from' ili 'now'.

// You can specify the zone id when creating a zoned date time ZoneId id = ZoneId.of("Europe/Paris"); ZonedDateTime zoned = ZonedDateTime.of(dateTime, id); zoned = ZonedDateTime.parse("2007-12-03T10:15:30+01:00[Europe/Paris]"); ZoneOffset offset = ZoneOffset.of("+2:00"); // Extract useful components ZoneId.from(zoned); OffsetDate.from(zoned); OffsetTime time = OffsetTime.now();

Vrednosti kojima se pristupa pomoću get* metoda, i novim objektima napravljenim pozivanjem metoda with* ili plus*, na nekom postojećem objektu.

// changes offset, whilst keeping the same point on the timeline OffsetTime sameTimeDifferentOffset = time.withOffsetSameInstant(offset); // changes the offset, and updates the point on the timeline OffsetTime changeTimeWithNewOffset = time.withOffsetSameLocal(offset); // Can also create new object with altered fields as before changeTimeWithNewOffset .withHours(3) .plusSeconds(2) .minusMinutes(4);

Dobro definisano naručeno poređenje zasnovano na vremenskoj liniji.

Snažan Adjuster mehanizam za za oblikovanje poslovne logike zasnovane na manipulacijama.

ZonedDateTime zdt; zdt = zoned.with(firstDayOfYear()); zdt = zoned.with(lastInMonth(TUESDAY)); zdt = zoned.with(time);

Baza podataka i JDBC

ANSI SQL pruža dve vrste koje se odnose na vremenske zone - varljiv, nazvan"TIME WITH TIME ZONE" i "TIMESTAMP WITH TIME ZONE". Nijedna od ove dve vrste zapravo ne skladišti vremensku zonu. Obe skladište odstupanje. Ovo je važno, jer to znači da ne možete da rešite tačno vremensku zonu, čak iako ste uporni. To znači da programeri treba da razmotre da li je bolji izbor da skladište samo odstupanje, ili takođe, treba da skladište i vremensku zonu.

Vredno je napomenuti da neće biti nikakvih javnih promena JDBC API -ja, da bi se podržao JSR-310 samo zbog spec. Postojeće generičke setObject i getObject metode će biti dovoljne.

Postojeće klase vremenskih zona

Postoje klase vremenskih zona u Java - java.util.TimeZone - ali one ne koriste JSR-310, jer je svih 310 klasa nepromenjivo, i vremenske zone su nepromenjive. Postoje takođe osetljivi, nekompatibilni problemi kojih treba biti svestan, naročito da prethodna implementacija vremenske zone koristi samo 32bita za skladištenje podataka vremenskih zona. Ovo ograničava vrednosti za podršku, na između 1901-12-13T20:45:52Z i 2038-01-19T03:14:07Z. Očigledno, JSR-310 nije ograničen nekim restrikcijama, i podržava širi spektar vremenskih zona. Rezultat je da kompatibilnost datuma, između postojećih klasa vremenskih zona i JSR-310 nije garantovana, ali ako uvek koristite nove klase, oni će vam obezbediti precizne informacije o vremenskim zonama za širi spektar datuma, nego što je to prethodno bilo moguće.

Zaključak

Pogledao sam kako se mogu koristiti vremenske zone, i kada treba uzeti u obzir OffsetDateTime i ZonedDateTime. U trećem delu, planiram da govorim o periodima, koji su način predstavljanja razlika između dva datuma ili vremena.

Možete pratiti poslednje faze JSR-310 programiranja, čitanjem mailing list ili na openjdk project , gde se vrši posao implementacije, i rezultati se šalju mejlom.