wtorek, 4 września 2012

Joda Time - czyli koniec problemów z datą w javie

Joda Time, czyli darmowa biblioteka, dzięki której zapomnimy o mało przyjemnych operacjach na dacie w javie. Java mimo swojej ewolucji nie zadbała o porządną implementację klas reprezentujących czas i datę.
Na szczęście internet jest pełen darmowych bibliotek, które ułatwiają życie developerom. Jedną z nich jest Joda Time, czyli biblioteczka dostarczająca proste i funkcjonalne API do operacji na dacie. Odpowiednie jary potrzebne do uruchomienia Joda Time w projekcie można ściągnąć z oficjalnej strony.

Tworzenie
Pytanie - w czym Joda Time jest lepsza od standardowych klas Javowych? Odpowiedz - praktycznie we wszystkim :). Już przy tworzeniu można zauważyć mnogość konstruktorów. Nasz obiekt reprezentujący datę można stworzyć na kilkanaście sposób, m.in. można podać rok, miesiąc, dzień, itd. Dla przykładu standardowy obiekt java.util.Date posiada 2 konstruktory.
DateTime dt = new DateTime();
DateTime dt2000 = new DateTime(2000, 12, 7, 12, 0); //2000-12-07 12:00
Dodatkowo każdy stworzony obiekt jest immutable. Obiekty org.joda.time.DateTime możemy w łatwy sposób zamienić na obiekty java.util.Date i na odwrót.
// from Joda to JDK
DateTime dt = new DateTime();
Date jdkDate = dt.toDate();

// from JDK to Joda
dt = new DateTime(jdkDate);

Pobieranie danych
W standardowych obiektach typu java.util.Date, aby pobrać jakąś składową daty (rok, miesiąc, dzień, itp.), trzeba było tworzyć obiekt java.util.Calendar albo używać zakazanych/nieaktualnych (Deprecated) metod getDay(), getMonth(), .... Nowe API dostarcza wiele metod, które jednoznacznie wskazują co pobierają (w java.util.Calendar istniała magiczna metoda get która przyjmowała magiczny parametr typu int co ma zwrócić :) ). Kilka wybranych metod z org.joda.time.DateTime:
dt.getMonthOfYear();
dt.getDayOfWeek();
dt.getHourOfDay();
dt.getDayOfYear();
Modyfikacja daty
W standardowym podejściu należałoby stworzyć obiekt java.util.Calendar, który posiada ogólne metody add(int field, int amount), set(int field, int amount), itd. Zmiana czegokolwiek wymagała częściowej znajomości klasy java.util.Calendar, ponieważ parametry podajemy jako int'y, które co prawda są stałymi klasy java.util.Calendar, ale nadal są tylko int'ami. Korzystając z Joda Time nie musimy się takimi rzeczami przejmować. Po prostu należy użyć jednej z wielu metod dodających, odejmujących, itp.
dt.plusWeeks(1);
dt.plusMinutes(10);
dt.minusHours(3);
dt.minusYears(2);
Formatowanie daty
W javie mamy coś takiego jak DateFormat, dzięki któremu możemy nadać dacie taki wygląd, jaki potrzebujemy. Korzystając z Joda Time mamy dwa szybkie sposoby z użyciem bezpośrednio naszej klasy lub tworzeniem obiektu formatera:
// Sposób 1
System.out.println(dt.toString("yyyy-MM-dd"));

// Sposób 2
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss");
System.out.println(formatter.print(dt));