I nästa version av Java, Java 8, kommer äntligen ett fullständigt bibliotek för hantering av datum och tid. Detta kommer att ersätta de befintliga klasserna som baseras på Date, respektive Calendar. Date är sedan länge deprecated men finns i många applikationer. Denna klass har en historia som baseras på den datastruktur som en gång fanns med i C från 1972. Den historiska ryggsäcken innehåller många märkligheter, såsom möjligheten att förändra ett datum, idag kan förvandlas till imorgon! Stöd för jämförelser mellan datum saknas, vilket krävs för sortering som ju är ett vanligt behov när man hanterar data innehållande någon form av datumstämpel. Det mest kuriösa inslaget i klassen Date är nog den konstruktor som tar tre parametrar, där man utgår från referensdatum där år sätts till 1900, månaderna börjar räknas från 0 och dag med värdet 1. I skrivande stund (2013-04-12) gäller således följande parameteruppsättning för att ange dagens datum Date(113, 3, 12
Javas nya Date and Time API kommer att placeras I en egen package-struktur med java.time som bas. Dokumentationen för de ingående klasser och interface antyder att API:et är mer svårbemästrat än vad det verkligen är. Alla klasser är immutable, trådsäkra och baserade på den internationella standarden för kalendrar, ISO 8601. Även om huvudspåret följer den Gregorianska kalendern, så finns det stöd för många olika kalendrar såsom ThaiBuddhist respektive Japanese Imperial. Månader som veckodagar hanteras nu med var sin Enum där konstanterna anges med engelska namn och har ett värdenummer som följer standard, vilket innebär att MONDAY räknas som dag 1 i veckan och DECEMBER har värdet 12. Det tog 18 år av Java-utveckling att komma hit…
De mest intressanta klasserna i API:et är följande:
LocalDate – Ett ”normalt” datum skrivet på formen YYYY-MM-DDenligt ISO-standarden och därmed kanske vi kan bli av med avarter som formaten mån/dag/år respektive dag/mån/år vilka kan ställa till stora problem där dag och månad lätt kan förväxlas. Bland en uppsjö av metoder kan nämnas ett flertal som tar fram ett nytt objekt baserat på stegning framåt eller bakåt utefter en datumlinje baserat på antal dagar, veckor, månader eller år.
LocalTime – En tidpunkt utan vare sig datum eller tidszon, med en upplösning på ner till nanosekund. Format enligt HH:MM:SS.xxxxxxxxx
LocalDateTime – En komplett tidsangivelse där såväl datum som tid på ett kombinerat format av de två beståndsdelarna med ett T som skiljetecken; YYYY-MM-DDTHH:MM:SS.xxx
Instant – En tidsstämpel som anges med nanosekunds precision. Detta är en klass som typiskt kommer att få stor användning vid loggning.
Clock – En abstrakt klass som kan användas för att ta fram aktuell tidpunkt, vilket även kommer att vara möjligt via metoden now() som finns i ett flertal klasser. Huvudsyftet med Clock är att stödja plug-in av alternativa implementationer där exempelvis en offset kan anges. Clock kan typiskt förenkla tester med inbyggda tidsberoenden.
Duration – En klass som beräknar tid mellan två Instant objekt vilka anger tidpunkter utefter en tidslinje. Det är möjligt att beräkna negativ tid genom att ange inparametrar mot tidaxelns riktning.
ZoneId – En klass som modellerar tidszoner med ett id som är unikt inom systemet. Olika tidzoner kan anges med speciella prefix såsom ‘UTC’, ‘GMT’, ‘UT’ ‘+’ eller ‘-‘, men kan också vara mera läsbara regionala id såsom Europe/Paris.
Slutligen ett citat från API dokumentationen som visar på att de nya klasserna och metoderna kan vara lätta att läsa och förstå även för en utomstående:
LocalDate customerBirthday = customer.loadBirthdayFromDatabase();
LocalDate today = LocalDate.now();
if (customerBirthday.equals(today)) {
LocalDate specialOfferExpiryDate = today.plusWeeks(2).with(next(FRIDAY));
customer.sendBirthdaySpecialOffer(specialOfferExpiryDate);
}
Kan det bli tydligare? Skynda att fynda!
/Kjell H Carlsson
Intresserad av att förkovra dig inom Java? Då ska du kika in på dessa länkar: