{"id":296,"date":"2018-10-21T21:02:55","date_gmt":"2018-10-21T19:02:55","guid":{"rendered":"http:\/\/spireng.sk\/?p=296"},"modified":"2018-11-04T20:54:26","modified_gmt":"2018-11-04T19:54:26","slug":"java-8-datetime-api","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/java-8-datetime-api\/","title":{"rendered":"Java 8 \u2013 Datetime API"},"content":{"rendered":"<p>Po poh\u013eade na <a href=\"http:\/\/spireng.sk\/en\/java-8-lambda\/\">Lambda v\u00fdrazy<\/a> a\u00a0<a href=\"http:\/\/spireng.sk\/en\/java-8-streamy\/\">Streamy<\/a> v\u00a0predch\u00e1dzaj\u00facich dieloch seri\u00e1lu o\u00a0Java 8 sa dnes pozrieme na jednu z\u00a0men\u0161\u00edch, ale tie\u017e pozoruhodn\u00fdch noviniek, ktor\u00e9 prin\u00e1\u0161a. Je \u0148ou Datetime API, ktor\u00e9 je pokusom (bohu\u017eia\u013e u\u017e nieko\u013ek\u00fdm v\u00a0porad\u00ed) privies\u0165 do sveta Javy pou\u017eite\u013en\u00e9 API na pr\u00e1cu s\u00a0d\u00e1tumom a\u00a0\u010dasom. Tentokr\u00e1t to vyzer\u00e1, \u017ee by to mohlo by\u0165 ono.<!--more--><\/p>\n<p>Java m\u00e1 s d\u00e1tumov\u00fdm a \u010dasov\u00fdm rozhran\u00edm dlh\u00fa a tak trochu ne\u0161\u0165astn\u00fa hist\u00f3riu. Zn\u00e1ma trieda java.util.Date pri\u0161la u\u017e vo verzii 1.0 aby sa ju n\u00e1sledne vo verzii 1.1 pok\u00fasila vystrieda\u0165 trieda java.util.Calendar. Obe tieto rozhrania mali svoje nedostatky (kto po \u010dase nech\u00e1pav\u00e9ho debugovania zistil, \u017ee mesiace sa \u010d\u00edsluj\u00fa od nuly \u2013 teda janu\u00e1r m\u00e1 \u010d\u00edslo 0 a december \u010d\u00edslo 11 \u2013 ruku hore). Obe s\u00fa neust\u00e1le pr\u00edtomn\u00e9 (aj ke\u010f pekne ozna\u010den\u00e9 Deprecated anot\u00e1ciou), \u010do e\u0161te umoc\u0148uje chaos v tom, \u010do sa m\u00e1 pou\u017e\u00edva\u0165. Oracle teda pri\u0161iel s novou verziou, tak sa po\u010fme pozrie\u0165, ako to s \u0148ou vyzer\u00e1.<\/p>\n<p>Z\u00e1kladom v\u0161etk\u00e9ho s\u00fa triedy LocalDate, LocalTime, LocalDatetime, Instant, Duration a Period. LocalDate a LocalTime maj\u00fa naozaj intuit\u00edvny n\u00e1zov a reprezentuj\u00fa lok\u00e1lny d\u00e1tum alebo lok\u00e1lny \u010das. LocalDatetime je potom ich kombin\u00e1ciou. Bez toho, aby sme prech\u00e1dzali ich kompletn\u00e9 API, urob\u00edme si z neho aspo\u0148 z\u00e1kladn\u00fa uk\u00e1\u017eku:<\/p>\n<p>Vytvorenie:<\/p>\n<pre class=\"Standard\" style=\"padding-left: 30px;\">LocalDate date = LocalDate.of(2017, 3, 1); \/\/&lt;- Janu\u00e1r m\u00e1 \u010d\u00edslo 1!<\/pre>\n<p>Z\u00e1kladn\u00fd pr\u00edstup k zlo\u017ek\u00e1m:<\/p>\n<pre style=\"padding-left: 30px;\">\u2026 = date.getYear();\r\n\u2026 = date.getMonth();<\/pre>\n<p>Alebo nie\u010do zauj\u00edmavej\u0161ie:<\/p>\n<pre style=\"padding-left: 30px;\">\u2026 = date.lengthOfMonth();\u00a0\u00a0\u00a0 \/\/ &lt;- po\u010det dn\u00ed v mesiaci\r\n\u2026 = date.isLeapYear();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ &lt;- je to priestupn\u00fd rok?<\/pre>\n<p>Tak\u017ee m\u00e1me nejak\u00e9 pekn\u00e9 triedy pre \u013eud\u00ed. A \u010do stroje? Pre nich je tu trieda Instant. T\u00e1 reprezentuje po\u010det sek\u00fand od 1.1.1970. Nie len tu, ale v \u010fal\u0161\u00edch \u010dastiach API plat\u00ed, \u017ee je rozdelen\u00e9 pr\u00e1ve do t\u00fdchto dvoch kateg\u00f3ri\u00ed \u2013 API pre \u013eudsk\u00e9 ch\u00e1panie \u010dasu a API pre strojov\u00e9 ch\u00e1panie \u010dasu.<\/p>\n<p>Ak m\u00e1me z\u00e1kladn\u00fd \u00fadaj o \u010dase (bod na \u010dasovej osi), po\u010fme sa pozrie\u0165 na intervaly. Tie s\u00fa reprezentovan\u00e9 dvoma triedami: Period a Duration. Period je op\u00e4\u0165 to API ur\u010den\u00e9 pre \u013eud\u00ed, preto\u017ee je to interval definovan\u00fd v \u013eudsk\u00fdch jednotk\u00e1ch:<\/p>\n<pre style=\"padding-left: 30px;\">LocalDate first = LocalDate.of(2017, Month.January, 1);\r\nLocalDate second = LocalDate.of(2017, Month.February, 1);\r\nPeriod twoDays = Period.between(first, second);<\/pre>\n<p>Duration je na druhej strane pr\u00e1ve to API, ktor\u00fd pracuje s \u010dasov\u00fdm intervalom tak, ako ho ch\u00e1pu stroje. Napr\u00edklad:<\/p>\n<pre style=\"padding-left: 30px;\">long ns = Duration.between(t1, t2).toNanos();<\/pre>\n<p>Nov\u00e9 Datetime API prin\u00e1\u0161a tie\u017e \u010fal\u0161iu novinku a to s\u00fa takzvan\u00e9 Temporal Adjusters. Je to skupina tried, ktor\u00e1 implementuje funk\u010dn\u00e9 rozhranie <em>TemporalAdjuster<\/em> s jednou met\u00f3dou adjustInto. Cie\u013eom t\u00fdchto tried je nejako modifikova\u0165 <em>Temporal<\/em> objekt (Temporal je spolo\u010dn\u00e9 rozhranie pre objekty, ktor\u00e9 reprezentuj\u00fa \u010das, teda aj LocalDate alebo Instant). T\u00e1 modifik\u00e1cia m\u00f4\u017ee vyzera\u0165 nasledovne:<\/p>\n<ul>\n<li>n\u00e1jdi prv\u00fd alebo posledn\u00fd de\u0148 v danom mesiaci<\/li>\n<li>n\u00e1jdi prv\u00fd alebo posledn\u00fd de\u0148 v nasleduj\u00facom mesiaci<\/li>\n<li>n\u00e1jdi napr. nasleduj\u00faci utorok<\/li>\n<li>at\u010f.<\/li>\n<\/ul>\n<p>Je to tak\u00e1 implement\u00e1cia Strategy vzoru, kde ka\u017ed\u00fd objekt reprezentuje strat\u00e9giu modifik\u00e1cie Temporal objektu.<\/p>\n<p>Aby som bol presn\u00fd, nie je to modifik\u00e1cia, ale vygenerovanie nie\u010doho nov\u00e9ho. Cel\u00e9 API je toti\u017e imutable, tak\u017ee p\u00f4vodn\u00fd objekt sa nemodifikuje, ale vracia sa nov\u00fd. A to plat\u00ed pre v\u0161etky met\u00f3dy v API, ktor\u00e9 by mali objekt modifikova\u0165.<\/p>\n<p>Nov\u00e9 Datetime API vyzer\u00e1 s\u013eubne. Po t\u00fdch rokoch zbierania in\u0161pir\u00e1cie (aj od zn\u00e1mej kni\u017enice JodaTime) by to u\u017e Oracle mohol urobi\u0165 poriadne. Ak si uvedom\u00edme, \u017ee \u010dasov\u00e1 zlo\u017eka je ve\u013emi \u010dasto pr\u00edtomn\u00e1 v ka\u017edom be\u017enom informa\u010dnom syst\u00e9me, tak fakt, \u017ee kone\u010dne je tu mo\u017eno dobre navrhnut\u00fd n\u00e1stroj na jeho zvl\u00e1dnutie, je celkom dobr\u00e1 spr\u00e1va.<\/p>","protected":false},"excerpt":{"rendered":"<p>Po poh\u013eade na Lambda v\u00fdrazy a\u00a0Streamy v\u00a0predch\u00e1dzaj\u00facich dieloch seri\u00e1lu o\u00a0Java 8 sa dnes pozrieme na jednu z\u00a0men\u0161\u00edch, ale tie\u017e pozoruhodn\u00fdch noviniek, ktor\u00e9 prin\u00e1\u0161a. Je \u0148ou Datetime API, ktor\u00e9 je pokusom (bohu\u017eia\u013e u\u017e nieko\u013ek\u00fdm v\u00a0porad\u00ed) privies\u0165 do sveta Javy pou\u017eite\u013en\u00e9 API na pr\u00e1cu s\u00a0d\u00e1tumom a\u00a0\u010dasom. Tentokr\u00e1t to vyzer\u00e1, \u017ee by to mohlo by\u0165 ono.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-296","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/296","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=296"}],"version-history":[{"count":6,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/296\/revisions"}],"predecessor-version":[{"id":303,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/296\/revisions\/303"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}