SlideShare ist ein Scribd-Unternehmen logo
1 von 62
Java 8 Date/Time API
Vaidas Pilkauskas
aš
• programuotojas
• pagrindinė kalba - Java
• domiuosi kitomis kalbomis - Scala,
JavaScript, Python, Ruby
• Kai neprogramuoju - dviračiai, snieglentė,
roko muzika, šiuolaikinis menas, Vilnius JUG
https://www.google.com/+VaidasPilkauskas
Legal
This work is licensed under the Creative Commons
Attribution 3.0 Unported License. To view a copy of this
license, visit http://creativecommons.org/licenses/by/3.0/
or send a letter to Creative Commons, 444 Castro
Street, Suite 900, Mountain View, California, 94041,
USA.
Slides 10-62 are derived from The new JDK 1.8 Date and
Time API – JSR-310 by Stephen Colebourne given at
JAX 2013.
All the other slides are based on various publicly available
internet resources listed at the end in the reference list.
Iki JDK8
Kodėl reikalingas naujas Date/Time
API?
java.util.Date is a testament to the fact that
even brilliant programmers can screw up.
java.util.Calendar, which Sun licensed to
rectify the Date mess, is a testament to the
fact that average programmers can screw up,
too.
http://stackoverflow.com/questions/1571265/why-is-the-java-date-api-java-
util-date-calendar-such-a-mess
java.util.Date
• Mutuojamas - galima keisti reikšmę
• Milisekundžių tikslumas nepakankamas
• new Date().getYear() //114
• Tinkamai nepalaiko laiko juostų
• Nėra patogių priemonių dirbti su intervalais
• Metai prasideda nuo 1900, mėnesio diena
nuo 1, visa kita nuo 0)
Date date = new Date(1L);
date.toString();
//Thu Jan 01 02:00:00 EET 1970
Nesilaikoma equals kontrakto
Date date = new Date();
Timestamp timeStamp = new
Timestamp(date.getTime());
date.equals(timeStamp); // true
timeStamp.equals(date); // false
java.util.Calendar
• Taip pat mutuojamas
• Nepatogus API
• Sunku pridėti naujus kalendorius
• Trūksta getterių paprastai datų informacijai
Calendar c = Calendar.getInstance();
int weekday = c.get(DAY_OF_WEEK);
Date d = c.getTime();
Joda-Time
Java ekosistemoje suvokiama kaip
“Kokybiška datos ir laiko biblioteka”
Tai kodėl ne Joda-Time yra Java 8
Date/Time API?
Nes nepakankamai tobula.
“Well, there is one key reason - Joda-Time
has design flaws.“ - Stephen Colebourne
http://blog.joda.org/2009/11/why-jsr-310-isn-joda-time_4941.html
Nuo JDK8
JSR 310
• Nauja datos ir laiko biblioteka
• Sukurta visiškai nuo pradžių
• Įtakota Joda-Time, speco vienas iš vadovų -
Stephen Colebourne
• Tai atviro kodo JSR projektas (palyginimui
Joda-Time - atviro kodo biblioteka)
o http://threeten.github.com/
o Originalus kodas BSD (3 clause) licencija
o OpenJDK kodas GPL
o virš 20000 testų
• Yra nuportintas JDK7
Tikslai
• Išsamus datos/laiko modelis
• Dažnai sutinkamų kalendorių palaikymas
• Tipizavimas
o vengti primityvų, kai yra prasmė
o save dokumentuojantis
o draugiškas IDE
• “Sutariantis” su egzistuojančiomis JDK
datų/laiko klasėmis
• Atsižvelgti į XML ir SQL poreikius
Projektavimo principai
• Nekeičiamumas (Immutability)
o thread-safe, tinka kešuoti, funkcinis programavimas
• Fluent API
o lengvai skaitomas, tarsi įprastas sakinys
• Švarus, aiškus, tikėtinas
o gerai apibrėžti metodai, paprastas JavaDoc
o stipri būsenos kontrolė
• Plečiamas
o JSR/JDK autoriai visko nežino
Kuo daugiau galvojame apie laiką...
Per daug savokų
• Tiek daug laiko savokų
• Pats “laikas” turi daug reikšmių
• Reikia apibrėžti nuoseklią srities kalbą!
Du pagrindiniai reikalavimai
• Tęstinis kompiuterio laikas
o vienas didėjantis skaičius
o suprojektuotas kompiuteriui
• Žmogaus
o paremtas laukeliais
o metai, mėnuo, diena, valanda, minutė, sekundė
Mašinos skalė
Momentas - Instant
• Vienas momentinis taškas laiko linijoje
• Įvykio Timestampas
• Java class - Instant
o matuojamas nanosekundėmis nuo 1970-01-01
o apima visatos amžiaus įvykius
o problema - nėra tinkamo primityvo - 96 bitų
Trukmė - Duration
• Laiko “kiekis” (amount)
• Nepriklauso nuo laiko linijos
• Java class - Duration
o matuojamas nanosekundėmis
o reikia 96 bitų
// instant
Instant start =
Instant.ofEpochMilli(123450L);
Instant end = Instant.now();
assert start.isBefore(end);
assert end.isAfter(start);
// duration
Duration duration = Duration.ofSeconds(12);
Duration bigger = duration.multipliedBy(4);
Duration biggest = bigger.plus(duration);
// combination
Instant later = start.plus(duration);
Instant earlier = start.minus(duration);
Tikslumas & keliamosios sekundės
Realybė
• SI sekundė fiksuoto ilgio
• Diena ilgiai gali būti skirtingi
• Astronomai sako, kad Žemė lėtėja
• Diena != (24 valandos * 60 minutės * 60 SI
sekundės)
• Realiai dienos ilgesnės nei 86400 SI
sekundės
• UTC įterpia keliamąją sekundę, kad
pataisytų dienos ilgį
• Kompiuteriai prastai palaiko keliamąsias
sekundes
Java milisekundės
• Java skaičiuoja milisekundes nuo 1970-01-
01
• Ką tai reiškia?
• Apibrėžimas netikslus, nes
• UTC pradėtas tik 1972-01-01
o 1970-01-01 taigi, pradžios taškas labai nepatogus
• Apibrėžimas - 86400 sekundės per dieną
o kas atsitinka toje vietoje, kur įterpiama keliamoji
sekundė?
Pasirinktas būdas
• Apibrėžta Java laiko skalė, ir susieta su
civiliniu laiku
• Vidurdienis tiksliai atitinka civilinį laiką
• Visas kitas laikas kiek įmanoma tiksliau
• Diena padalinta į 86400 daleles - “sekundes”
• Java epocha prasideda 1970-01-01
• Tai reiškia, kad programuotojai gali ignoruoti
keliamąsias sekundes
• Nieko naujo, tai UTC-SLS
• Tai tik apibrėžimas, viskas priklauso nuo OS
Žmogaus skalė
Žmogaus skalė
• Žmogaus data/laikas
o paremtas laukeliais
o metai, mėnuo, diena, minutė, sekundė
o 7 dienų savaitė, diena - 24 valandos
• Reikalavimai
o Data ir laikas
o Data be laiko
o Laikas be datos
o Laiko juostos skirtumas nuo UTC
o Laiko zona
Vietos data - Local date
• Data be laiko ir laiko zonos
• pvz., gimtadienis
• pvz., šventinė diena, atostogų pradžia
• Java klasė - LocalDate
o saugomi metai-mėnuo-diena
// 2014-03-12
Vietos laikas - Local time
• Laikas be datos ir laiko zonos
• pvz., parduotuvės atidarymo laikas
• pvz., laikas sieniniame laikrodyje
• Java klasė - LocalTime
o saugoma valanda-minutė-sekundė-nanosekundė
// 20:30
Vietos data su laiku - Local date-time
• Data su laiku be laiko zonos
• pvz., vietinis laikas, kada kyla lėktuvas
• Java klasė - LocalDateTime
o apjungia LocalDate & LocalTime
// 2014-03-12T20:30
Zonos poslinkis - Zone-offset
• Poslinkis valandomis ir minutėmis nuo UTC
• Lietuva priekyje UTC - teigiama reikšmė
• JAV atsilieka nuo UTC - neigiama reikšmė
• Java klasė - ZoneOffset
o saugo sekundes -18:00 to +18:00 diapazone
// +01:00
Data ir laikas su poslinkiu - Offset
date-time
• Data ir laikas su zonos poslinkiu
• pvz., audito įrašo timestampas su laiko zona
• Tas pats momentas - Instant, tik su
papildoma poslinkio informacija
• Java class - OffsetDateTime
o apjungia LocalDateTime & ZoneOffset
// 2014-03-12T20:30+02:00
Kitos klasės
• Year
• YearMonth
• MonthDay
• Month - enum
• DayOfWeek - enum
• OffsetTime - local time + zone-offset
Užklausos
• Getteriai
• Metodai grąžina geriausią tipą tam laukui
o daugumai laukų - primityvai
o enumai savaitės dienai, mėnesiui
LocalDate date = LocalDate.of(2010, 12, 3);
int year = date.getYear();
Month month = date.getMonth();
int dom = date.getDayOfMonth();
boolean leap = date.isLeapYear();
int monthLen = date.lengthOfMonth();
Atnaujinimai
• Beveik viskas - nekintama (nemutuojama)
• Naudojamas 'with' metodas vietoje ‘set’
o nekeičiamas originalus objektas
o grąžinama nauja, patobulinta kopija
o norint toliau naudoti, reikia išsisaugoti
LocalDate date = LocalDate.of(2010,Month.DECEMBER,3);
LocalDate later = date.withYear(2011);
LocalDate between = date.with(Month.MAY);
Derintojai - Adjusters
• Sudėtingesni pakeitimai gali būti atliekami Adjusterių
pagalba, pvz.:
o iš turimos datos gauti paskutinę mėnesio dieną
o iš turimos datos gauti kitą antrą trečiadienį (kada
kitas JUGas?)
public interface TemporalAdjuster {
Temporal adjustInto(Temporal input);
}
LocalDate adjusted = date.with(lastDayOfMonth());
LocalDate adjusted = date.with(next2ndWednesday());
Laiko zonos
Laiko zonų apžvalga
• Pasaulis padalintas įvairias laiko zonas
• Vietovės laikas apibrėžiamas politinių taisyklių
o Sirija pakeičia vasaros laiką (DST) su 3 dienų
perspėjimu
o Vakarų Australija turėjo 3 metų DST eksperimentą
o Brazilija keičia DST kasmet
o Egiptas turėjo du DST periodus 2010
• Taisyklės apibrėžia laiko zonos poslinkio pasikeitimą
o "Žiemą Lietuva bus 2 valandomis priekyje nuo UTC,
o vasarą jau 3. Laikas persukamas viena valanda į
priekį paskutinį kovo sekmadienį ir atsukamas atgal
paskutinį spalio sekmadienį."
Laiko zonų analizė
• Keletas grupių renka ir teikia informaciją apie
TZ taisykles
o IANA "Timezone database" (TZDB)
o Windows
o IATA - Tarptautinė oro transporto asociacija
• Kiekviena grupė apibrėžia savo identifikatorių
• TZDB naudoja 'Europe/Vilnius' Lietuvai
• Taisyklės apibrėžia ilgalaikius DST pakeitimus
• bei kada keičiasi poslinkis
Laiko zonų dizainas
• JDK javadoc:
o “TimeZone represents a time zone offset, and also
figures out daylight savings”
• JSR-310 atskiria atsakomybes
o ZoneOffset – nuo +14:00 iki -12:00
o ZoneRules – poslinkių keitimo taisyklės
o ZoneId – zonos identifikatorius, identifikuoja
vietą/valdžią
• Tik viena papildoma datos/laiko klasė
o ZonedDateTime
Zonų laiko tarpai ir persidengimai
• Pavasario DST “tarpas”
• Rudens DST “persidengimas”
• JSR-310 nemeta exceptionų, o Joda-Time meta
o prasmingas datos interpretavimas
o Pagal nutylėjimą - vasaros laikas
// one day before DST ends (overlap of one hour)
ZoneId zone = ZoneId.of("Europe/London");
ZonedDateTime dt = ZonedDateTime.of(2010, 10, 27, 1, 30, 0, 0, zone);
// dt = 2010-10-27 01:30 +01:00
dt = dt.plusDays(1);
// dt = 2010-10-28 01:30 +01:00
// retains the offset where possible
dt = dt.plusHours(1);
// dt = 2010-10-28 01:30 +00:00
// offset changes, same time
Galima pasitikrinti
ZoneId zone = ZoneId.of("Europe/London");
LocalDateTime ldt =
LocalDateTime.of(2010,10,27,1,30);
ZoneOffsetTransition trn =
zone.getRules().getTransition(ldt);
if (trn != null) {
if (trn.isGap()) { ... }
if (trn.isOverlap()) { ... }
}
Klasių santrauka
• LocalDate 2010-12-03
• LocalTime 11:05:30
• LocalDateTime 2010-12-03T11:05:30
• OffsetTime 11:05:30+01:00
• OffsetDateTime 2010-12-03T11:05:30+01:00
• ZonedDateTime 2010-12-03T11:05:30+01:00
Europe/Paris
• Year 2010
• YearMonth 2010-12
• MonthDay 12-03
• Instant 2576458258.266 epoch-
seconds
Integracija
Egzistuojančios JDK klasės
• Date, Calendar, SQL kalsės ir TimeZone
o konvertavimo metodai į ir iš JSR-310 tipus
o ne deprecated :(
• JSR-310 nepriklauso nuo senųjų klasių (teoriškai
reiškia, kad kažkada galima bus išmesti senąsias
klases)
ISO-8601
• Visos klasės ir toString() paremtos ISO-8601
• Pagrįstas Grigaliaus kalendoriumi
• Nusako, kaip skaičiais atvaizduoti datas/laikus
• Kitų internetinių standartų bazė, tokių kaip XML
o XML schema gerai atitinka JSR-310 klases
SQL duomenų bazės
•
• Klasės atitinka SQL
o LocalDate DATE
o LocalTime TIME WITHOUT TIME ZONE
o LocalDateTime TIMESTAMP WITHOUT
TIMEZONE
o OffsetTime TIME WITH TIME ZONE
o OffsetDateTime TIMESTAMP WITH TIME
ZONE
• JDBC atnaujintas, kad atitiktų JSR-310
Kalendoriai
Calendar systems
• Bazinis kalendorius paremtas ISO-8601
o dabartinis civilinis kalendorius
o istoriškai netikslus
 katalikai - 1582
 britai - 1752
 rusai - 1917?
• Reikalavimai
o JDK turi palaikyti įprastus kalendorius
o kalendorių palaikymas neturi pasunkinti API
naudojimo
o nedviprasmiškas API
Regioninės kalendorių sistemos
• Dažniausiai naudojami ne ISO kalendoriai
o Islamo, Japonų, Kinų, Budizmo ir kiti
• Pasiekiami pagal pavadinimą
• Pasiekiami pagal BCP-47 lokalės išplėtimą
o th-TH-u-ca-buddhist
• Datos – era, metai, mėnuo, diena
o mėnesių ilgiai & tvarka skiriasi
• Leidžiamos tik datos variacijos
o ignoruojami kalendoriai pradedantys dieną skirtingu
metu (saulėtekis/saulėlydis)
Kalendorių chronologijos
• Chronology apibrėžia kalendoriaus sistemą
o factory’is kurti datoms
• ChronoLocalDate
• ChronoLocalDateTime
• ChronoZonedDateTime
o laikas yra standartinis LocalTime
Here be dragons!
• Dirbti su kitais kalendoriais sudėtinga
• Daug ISO prielaidų negalioja
• Lengva suklysti
• Būtina daryti kodo peržiūras!
• Taigi...
Here be dragons!
• Naudokite ISO, ne Chrono klases
• See ChronoLocalDate Javadoc paaiškinimą
• Nesaugokite kalendoriaus visoje sistemoje
• Kalendorius naudotojo profilio dalis
• Konvertuokite atvaizduodami UI
Kas liko
Elementų kombinavimas
• Lengva apjungti datos ir laiko objektus
• Naudojant ‘at’
• taip vadinamas Fluent API
LocalDate date = Year.of(2013).atMonth(MARCH).atDay(27);
LocalDateTime dt = date.atTime(12, 30);
OffsetDateTime odt = dt.atOffset(ZoneOffset.ofHours(2));
ZoneId london = ZoneId.of("Europe/London");
ZonedDateTime zdt1 = date.atStartOfDay(london);
ZonedDateTime zdt2 = Instant.now().atZone(london);
Periodai - Periods
• Datos pagrindo laiko “kiekis” pasiekiamas žmogiškais
laukais
o 6 metai, 2 mėnesiai ir 12 dienų
• Panaudojimo pvz.:
o konferencijos ilgis – 5 dienos
o nėštumas – 9 mėnesiai
• Java klasė - Period
o laukeliai metams, mėnesiams, dienoms
• galima atimti/pridėti prie datos/laiko
• Duration klasė - laiko ekvivalentas
Dabartinis laikas - Current time
• Priklauso nuo laiko zonos
o dažnai tai pamirštame
• Reikalavimai
o sustabdyti laiką testuose
o pakeisti laiką į praeitį/ateitį
o pristabdyti/paspartinti
Dabartinis laikas - Current time
• Pasiekti esamą laiką naudojant objektą
o vengti Singleton
o Inversion of Control
• Galima implementuoti subklasę
o taigi - kontroliuoti laiką :)
// system millis, default time zone
Instant instant = Instant.now(Clock.system());
LocalDate date = LocalDate.now(Clock.system());
// system millis, specified time zone
ZoneId zone = ZoneId.of("Europe/Moscow");
LocalDate date = LocalDate.now(Clock.system(zone));
Dabartinis laikas - Current time
• Palaiko Inversion of Control
o inject Clock
o galima turėti 'stop time' subklasę testavimui
public class MyForm {
@Inject
private Clock clock; // inject with Spring/Guice
public void validate(LocalDate date) {
if (date.isBefore(LocalDate.now(clock))) {
// error
}
}
}
Formatting and Parsing
• toString() grąžina ISO-8601
• Formatavimas/parsinimas palaiko šablonus
o kaip kad SimpleDateFormat
o taip pat sudėtingesnius formatus
• pagrindinė formatavimo klasė - DateTimeFormatter
• Pateikia daug įprastų formaterių
Amount between
• Lengva suskaičiuoti laikotarpį tarp dviejų datų/laikų
• Pagal vienetus
• Arba visą periodą/trukmę (Period/Duration)
LocalDate date1 = LocalDate.of(2012, 3, 4);
LocalDate date2 = LocalDate.of(2013, 1, 26);
// Duration
long days = DAYS.between(date1, date2);
// Period
Period period = Period.between(date1, date2);
Plėtimo galimybės
• Plečiama 5 būdais, parašant savo
o datos/laiko klasę
o kiekio (amount) klasę
o datos/laiko laukelius
o datos/laiko vienetus
o kalendorių
• Nepamiršti apie Javadoc kontraktus!
Summary
• JSR-310 naujas JDK8 Date/Time API
• Išbandykite JDK 8 buildą arba JDK 7
backportą
• http://threeten.github.com

Weitere ähnliche Inhalte

Empfohlen

Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at WorkGetSmarter
 

Empfohlen (20)

Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 

Java 8 Date/Time API (Lithuanian)

  • 1. Java 8 Date/Time API Vaidas Pilkauskas
  • 2. aš • programuotojas • pagrindinė kalba - Java • domiuosi kitomis kalbomis - Scala, JavaScript, Python, Ruby • Kai neprogramuoju - dviračiai, snieglentė, roko muzika, šiuolaikinis menas, Vilnius JUG https://www.google.com/+VaidasPilkauskas
  • 3. Legal This work is licensed under the Creative Commons Attribution 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. Slides 10-62 are derived from The new JDK 1.8 Date and Time API – JSR-310 by Stephen Colebourne given at JAX 2013. All the other slides are based on various publicly available internet resources listed at the end in the reference list.
  • 5. Kodėl reikalingas naujas Date/Time API? java.util.Date is a testament to the fact that even brilliant programmers can screw up. java.util.Calendar, which Sun licensed to rectify the Date mess, is a testament to the fact that average programmers can screw up, too. http://stackoverflow.com/questions/1571265/why-is-the-java-date-api-java- util-date-calendar-such-a-mess
  • 6. java.util.Date • Mutuojamas - galima keisti reikšmę • Milisekundžių tikslumas nepakankamas • new Date().getYear() //114 • Tinkamai nepalaiko laiko juostų • Nėra patogių priemonių dirbti su intervalais • Metai prasideda nuo 1900, mėnesio diena nuo 1, visa kita nuo 0) Date date = new Date(1L); date.toString(); //Thu Jan 01 02:00:00 EET 1970
  • 7. Nesilaikoma equals kontrakto Date date = new Date(); Timestamp timeStamp = new Timestamp(date.getTime()); date.equals(timeStamp); // true timeStamp.equals(date); // false
  • 8. java.util.Calendar • Taip pat mutuojamas • Nepatogus API • Sunku pridėti naujus kalendorius • Trūksta getterių paprastai datų informacijai Calendar c = Calendar.getInstance(); int weekday = c.get(DAY_OF_WEEK); Date d = c.getTime();
  • 9. Joda-Time Java ekosistemoje suvokiama kaip “Kokybiška datos ir laiko biblioteka” Tai kodėl ne Joda-Time yra Java 8 Date/Time API? Nes nepakankamai tobula. “Well, there is one key reason - Joda-Time has design flaws.“ - Stephen Colebourne http://blog.joda.org/2009/11/why-jsr-310-isn-joda-time_4941.html
  • 11. JSR 310 • Nauja datos ir laiko biblioteka • Sukurta visiškai nuo pradžių • Įtakota Joda-Time, speco vienas iš vadovų - Stephen Colebourne • Tai atviro kodo JSR projektas (palyginimui Joda-Time - atviro kodo biblioteka) o http://threeten.github.com/ o Originalus kodas BSD (3 clause) licencija o OpenJDK kodas GPL o virš 20000 testų • Yra nuportintas JDK7
  • 12. Tikslai • Išsamus datos/laiko modelis • Dažnai sutinkamų kalendorių palaikymas • Tipizavimas o vengti primityvų, kai yra prasmė o save dokumentuojantis o draugiškas IDE • “Sutariantis” su egzistuojančiomis JDK datų/laiko klasėmis • Atsižvelgti į XML ir SQL poreikius
  • 13. Projektavimo principai • Nekeičiamumas (Immutability) o thread-safe, tinka kešuoti, funkcinis programavimas • Fluent API o lengvai skaitomas, tarsi įprastas sakinys • Švarus, aiškus, tikėtinas o gerai apibrėžti metodai, paprastas JavaDoc o stipri būsenos kontrolė • Plečiamas o JSR/JDK autoriai visko nežino
  • 14. Kuo daugiau galvojame apie laiką...
  • 15. Per daug savokų • Tiek daug laiko savokų • Pats “laikas” turi daug reikšmių • Reikia apibrėžti nuoseklią srities kalbą!
  • 16. Du pagrindiniai reikalavimai • Tęstinis kompiuterio laikas o vienas didėjantis skaičius o suprojektuotas kompiuteriui • Žmogaus o paremtas laukeliais o metai, mėnuo, diena, valanda, minutė, sekundė
  • 18. Momentas - Instant • Vienas momentinis taškas laiko linijoje • Įvykio Timestampas • Java class - Instant o matuojamas nanosekundėmis nuo 1970-01-01 o apima visatos amžiaus įvykius o problema - nėra tinkamo primityvo - 96 bitų
  • 19. Trukmė - Duration • Laiko “kiekis” (amount) • Nepriklauso nuo laiko linijos • Java class - Duration o matuojamas nanosekundėmis o reikia 96 bitų
  • 20. // instant Instant start = Instant.ofEpochMilli(123450L); Instant end = Instant.now(); assert start.isBefore(end); assert end.isAfter(start); // duration Duration duration = Duration.ofSeconds(12); Duration bigger = duration.multipliedBy(4); Duration biggest = bigger.plus(duration); // combination Instant later = start.plus(duration); Instant earlier = start.minus(duration);
  • 22. Realybė • SI sekundė fiksuoto ilgio • Diena ilgiai gali būti skirtingi • Astronomai sako, kad Žemė lėtėja • Diena != (24 valandos * 60 minutės * 60 SI sekundės) • Realiai dienos ilgesnės nei 86400 SI sekundės • UTC įterpia keliamąją sekundę, kad pataisytų dienos ilgį • Kompiuteriai prastai palaiko keliamąsias sekundes
  • 23. Java milisekundės • Java skaičiuoja milisekundes nuo 1970-01- 01 • Ką tai reiškia? • Apibrėžimas netikslus, nes • UTC pradėtas tik 1972-01-01 o 1970-01-01 taigi, pradžios taškas labai nepatogus • Apibrėžimas - 86400 sekundės per dieną o kas atsitinka toje vietoje, kur įterpiama keliamoji sekundė?
  • 24. Pasirinktas būdas • Apibrėžta Java laiko skalė, ir susieta su civiliniu laiku • Vidurdienis tiksliai atitinka civilinį laiką • Visas kitas laikas kiek įmanoma tiksliau • Diena padalinta į 86400 daleles - “sekundes” • Java epocha prasideda 1970-01-01 • Tai reiškia, kad programuotojai gali ignoruoti keliamąsias sekundes • Nieko naujo, tai UTC-SLS • Tai tik apibrėžimas, viskas priklauso nuo OS
  • 26. Žmogaus skalė • Žmogaus data/laikas o paremtas laukeliais o metai, mėnuo, diena, minutė, sekundė o 7 dienų savaitė, diena - 24 valandos • Reikalavimai o Data ir laikas o Data be laiko o Laikas be datos o Laiko juostos skirtumas nuo UTC o Laiko zona
  • 27. Vietos data - Local date • Data be laiko ir laiko zonos • pvz., gimtadienis • pvz., šventinė diena, atostogų pradžia • Java klasė - LocalDate o saugomi metai-mėnuo-diena // 2014-03-12
  • 28. Vietos laikas - Local time • Laikas be datos ir laiko zonos • pvz., parduotuvės atidarymo laikas • pvz., laikas sieniniame laikrodyje • Java klasė - LocalTime o saugoma valanda-minutė-sekundė-nanosekundė // 20:30
  • 29. Vietos data su laiku - Local date-time • Data su laiku be laiko zonos • pvz., vietinis laikas, kada kyla lėktuvas • Java klasė - LocalDateTime o apjungia LocalDate & LocalTime // 2014-03-12T20:30
  • 30. Zonos poslinkis - Zone-offset • Poslinkis valandomis ir minutėmis nuo UTC • Lietuva priekyje UTC - teigiama reikšmė • JAV atsilieka nuo UTC - neigiama reikšmė • Java klasė - ZoneOffset o saugo sekundes -18:00 to +18:00 diapazone // +01:00
  • 31. Data ir laikas su poslinkiu - Offset date-time • Data ir laikas su zonos poslinkiu • pvz., audito įrašo timestampas su laiko zona • Tas pats momentas - Instant, tik su papildoma poslinkio informacija • Java class - OffsetDateTime o apjungia LocalDateTime & ZoneOffset // 2014-03-12T20:30+02:00
  • 32. Kitos klasės • Year • YearMonth • MonthDay • Month - enum • DayOfWeek - enum • OffsetTime - local time + zone-offset
  • 33. Užklausos • Getteriai • Metodai grąžina geriausią tipą tam laukui o daugumai laukų - primityvai o enumai savaitės dienai, mėnesiui LocalDate date = LocalDate.of(2010, 12, 3); int year = date.getYear(); Month month = date.getMonth(); int dom = date.getDayOfMonth(); boolean leap = date.isLeapYear(); int monthLen = date.lengthOfMonth();
  • 34. Atnaujinimai • Beveik viskas - nekintama (nemutuojama) • Naudojamas 'with' metodas vietoje ‘set’ o nekeičiamas originalus objektas o grąžinama nauja, patobulinta kopija o norint toliau naudoti, reikia išsisaugoti LocalDate date = LocalDate.of(2010,Month.DECEMBER,3); LocalDate later = date.withYear(2011); LocalDate between = date.with(Month.MAY);
  • 35. Derintojai - Adjusters • Sudėtingesni pakeitimai gali būti atliekami Adjusterių pagalba, pvz.: o iš turimos datos gauti paskutinę mėnesio dieną o iš turimos datos gauti kitą antrą trečiadienį (kada kitas JUGas?) public interface TemporalAdjuster { Temporal adjustInto(Temporal input); } LocalDate adjusted = date.with(lastDayOfMonth()); LocalDate adjusted = date.with(next2ndWednesday());
  • 37. Laiko zonų apžvalga • Pasaulis padalintas įvairias laiko zonas • Vietovės laikas apibrėžiamas politinių taisyklių o Sirija pakeičia vasaros laiką (DST) su 3 dienų perspėjimu o Vakarų Australija turėjo 3 metų DST eksperimentą o Brazilija keičia DST kasmet o Egiptas turėjo du DST periodus 2010 • Taisyklės apibrėžia laiko zonos poslinkio pasikeitimą o "Žiemą Lietuva bus 2 valandomis priekyje nuo UTC, o vasarą jau 3. Laikas persukamas viena valanda į priekį paskutinį kovo sekmadienį ir atsukamas atgal paskutinį spalio sekmadienį."
  • 38. Laiko zonų analizė • Keletas grupių renka ir teikia informaciją apie TZ taisykles o IANA "Timezone database" (TZDB) o Windows o IATA - Tarptautinė oro transporto asociacija • Kiekviena grupė apibrėžia savo identifikatorių • TZDB naudoja 'Europe/Vilnius' Lietuvai • Taisyklės apibrėžia ilgalaikius DST pakeitimus • bei kada keičiasi poslinkis
  • 39. Laiko zonų dizainas • JDK javadoc: o “TimeZone represents a time zone offset, and also figures out daylight savings” • JSR-310 atskiria atsakomybes o ZoneOffset – nuo +14:00 iki -12:00 o ZoneRules – poslinkių keitimo taisyklės o ZoneId – zonos identifikatorius, identifikuoja vietą/valdžią • Tik viena papildoma datos/laiko klasė o ZonedDateTime
  • 40. Zonų laiko tarpai ir persidengimai • Pavasario DST “tarpas” • Rudens DST “persidengimas” • JSR-310 nemeta exceptionų, o Joda-Time meta o prasmingas datos interpretavimas o Pagal nutylėjimą - vasaros laikas // one day before DST ends (overlap of one hour) ZoneId zone = ZoneId.of("Europe/London"); ZonedDateTime dt = ZonedDateTime.of(2010, 10, 27, 1, 30, 0, 0, zone); // dt = 2010-10-27 01:30 +01:00 dt = dt.plusDays(1); // dt = 2010-10-28 01:30 +01:00 // retains the offset where possible dt = dt.plusHours(1); // dt = 2010-10-28 01:30 +00:00 // offset changes, same time
  • 41. Galima pasitikrinti ZoneId zone = ZoneId.of("Europe/London"); LocalDateTime ldt = LocalDateTime.of(2010,10,27,1,30); ZoneOffsetTransition trn = zone.getRules().getTransition(ldt); if (trn != null) { if (trn.isGap()) { ... } if (trn.isOverlap()) { ... } }
  • 42. Klasių santrauka • LocalDate 2010-12-03 • LocalTime 11:05:30 • LocalDateTime 2010-12-03T11:05:30 • OffsetTime 11:05:30+01:00 • OffsetDateTime 2010-12-03T11:05:30+01:00 • ZonedDateTime 2010-12-03T11:05:30+01:00 Europe/Paris • Year 2010 • YearMonth 2010-12 • MonthDay 12-03 • Instant 2576458258.266 epoch- seconds
  • 44. Egzistuojančios JDK klasės • Date, Calendar, SQL kalsės ir TimeZone o konvertavimo metodai į ir iš JSR-310 tipus o ne deprecated :( • JSR-310 nepriklauso nuo senųjų klasių (teoriškai reiškia, kad kažkada galima bus išmesti senąsias klases)
  • 45. ISO-8601 • Visos klasės ir toString() paremtos ISO-8601 • Pagrįstas Grigaliaus kalendoriumi • Nusako, kaip skaičiais atvaizduoti datas/laikus • Kitų internetinių standartų bazė, tokių kaip XML o XML schema gerai atitinka JSR-310 klases
  • 46. SQL duomenų bazės • • Klasės atitinka SQL o LocalDate DATE o LocalTime TIME WITHOUT TIME ZONE o LocalDateTime TIMESTAMP WITHOUT TIMEZONE o OffsetTime TIME WITH TIME ZONE o OffsetDateTime TIMESTAMP WITH TIME ZONE • JDBC atnaujintas, kad atitiktų JSR-310
  • 48. Calendar systems • Bazinis kalendorius paremtas ISO-8601 o dabartinis civilinis kalendorius o istoriškai netikslus  katalikai - 1582  britai - 1752  rusai - 1917? • Reikalavimai o JDK turi palaikyti įprastus kalendorius o kalendorių palaikymas neturi pasunkinti API naudojimo o nedviprasmiškas API
  • 49. Regioninės kalendorių sistemos • Dažniausiai naudojami ne ISO kalendoriai o Islamo, Japonų, Kinų, Budizmo ir kiti • Pasiekiami pagal pavadinimą • Pasiekiami pagal BCP-47 lokalės išplėtimą o th-TH-u-ca-buddhist • Datos – era, metai, mėnuo, diena o mėnesių ilgiai & tvarka skiriasi • Leidžiamos tik datos variacijos o ignoruojami kalendoriai pradedantys dieną skirtingu metu (saulėtekis/saulėlydis)
  • 50. Kalendorių chronologijos • Chronology apibrėžia kalendoriaus sistemą o factory’is kurti datoms • ChronoLocalDate • ChronoLocalDateTime • ChronoZonedDateTime o laikas yra standartinis LocalTime
  • 51. Here be dragons! • Dirbti su kitais kalendoriais sudėtinga • Daug ISO prielaidų negalioja • Lengva suklysti • Būtina daryti kodo peržiūras! • Taigi...
  • 52. Here be dragons! • Naudokite ISO, ne Chrono klases • See ChronoLocalDate Javadoc paaiškinimą • Nesaugokite kalendoriaus visoje sistemoje • Kalendorius naudotojo profilio dalis • Konvertuokite atvaizduodami UI
  • 54. Elementų kombinavimas • Lengva apjungti datos ir laiko objektus • Naudojant ‘at’ • taip vadinamas Fluent API LocalDate date = Year.of(2013).atMonth(MARCH).atDay(27); LocalDateTime dt = date.atTime(12, 30); OffsetDateTime odt = dt.atOffset(ZoneOffset.ofHours(2)); ZoneId london = ZoneId.of("Europe/London"); ZonedDateTime zdt1 = date.atStartOfDay(london); ZonedDateTime zdt2 = Instant.now().atZone(london);
  • 55. Periodai - Periods • Datos pagrindo laiko “kiekis” pasiekiamas žmogiškais laukais o 6 metai, 2 mėnesiai ir 12 dienų • Panaudojimo pvz.: o konferencijos ilgis – 5 dienos o nėštumas – 9 mėnesiai • Java klasė - Period o laukeliai metams, mėnesiams, dienoms • galima atimti/pridėti prie datos/laiko • Duration klasė - laiko ekvivalentas
  • 56. Dabartinis laikas - Current time • Priklauso nuo laiko zonos o dažnai tai pamirštame • Reikalavimai o sustabdyti laiką testuose o pakeisti laiką į praeitį/ateitį o pristabdyti/paspartinti
  • 57. Dabartinis laikas - Current time • Pasiekti esamą laiką naudojant objektą o vengti Singleton o Inversion of Control • Galima implementuoti subklasę o taigi - kontroliuoti laiką :) // system millis, default time zone Instant instant = Instant.now(Clock.system()); LocalDate date = LocalDate.now(Clock.system()); // system millis, specified time zone ZoneId zone = ZoneId.of("Europe/Moscow"); LocalDate date = LocalDate.now(Clock.system(zone));
  • 58. Dabartinis laikas - Current time • Palaiko Inversion of Control o inject Clock o galima turėti 'stop time' subklasę testavimui public class MyForm { @Inject private Clock clock; // inject with Spring/Guice public void validate(LocalDate date) { if (date.isBefore(LocalDate.now(clock))) { // error } } }
  • 59. Formatting and Parsing • toString() grąžina ISO-8601 • Formatavimas/parsinimas palaiko šablonus o kaip kad SimpleDateFormat o taip pat sudėtingesnius formatus • pagrindinė formatavimo klasė - DateTimeFormatter • Pateikia daug įprastų formaterių
  • 60. Amount between • Lengva suskaičiuoti laikotarpį tarp dviejų datų/laikų • Pagal vienetus • Arba visą periodą/trukmę (Period/Duration) LocalDate date1 = LocalDate.of(2012, 3, 4); LocalDate date2 = LocalDate.of(2013, 1, 26); // Duration long days = DAYS.between(date1, date2); // Period Period period = Period.between(date1, date2);
  • 61. Plėtimo galimybės • Plečiama 5 būdais, parašant savo o datos/laiko klasę o kiekio (amount) klasę o datos/laiko laukelius o datos/laiko vienetus o kalendorių • Nepamiršti apie Javadoc kontraktus!
  • 62. Summary • JSR-310 naujas JDK8 Date/Time API • Išbandykite JDK 8 buildą arba JDK 7 backportą • http://threeten.github.com