Das Arbeiten mit Kalender, Daten und Uhrzeiten ist ein komplexes Thema, dass von der Standard Java API abgedeckt wird. Allerdings sind gängige Aufgaben mit Kalenderdaten etwas umständlich zu lösen.
Das Apache Commons Projekt bietet eine Vielzahl von wiederverwendbaren Komponenten für die Java-Entwicklung. Das Teilprojekt apache.commons.lang bietet Ergänzungen zum Arbeiten mit den Basisklassen von Java. Dieser Eintrag betrachtet die Klassen des Pakets commons.lang.time.
Angenommende Aufgabe: Ermitteln des Datums von morgen, aber ohne Stunden/Minuten/Sekunden Angabe. Folgend nun eine Gegenüberstellung der Standard-Java und der Apache-Commons Lösung:
// Jan 22 10:30:06 CET 2009 -> Jan 23 00:00:00 CET 2009 Calendar calendar = GregorianCalendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date tomorrowTrunc = calendar.getTime(); |
// Jan 22 10:30:06 CET 2009 -> Jan 23 00:00:00 CET 2009 Date d1 = DateUtils.addDays(new Date(), 1); Date tomorrowTrunc = DateUtils.truncate(d1, Calendar.DATE); |
Weiterhin bringt die Klasse DurationFormatUtils simplifizierte statische Methoden zur Formatierung von Laufzeiten.
DurationFormatUtils.formatDurationWords(415486341, false, false); // 4 days 19 hours 24 minutes 46 seconds DurationFormatUtils.formatDuration(415486341, "HH:mm:ss"); // 115:24:46 DurationFormatUtils.formatDurationHMS(415486341); // 115:24:46.341 DurationFormatUtils.formatPeriod(new Date().getTime(), tomorrowTrunc.getTime(), "HH:mm"); // 10:34 |
Um eine flexible und schnelle Benutzereingabe eines Datums zuzulassen eignet sich nur ein Textfeld mit freier Texteingabe. Allerdings kann eine solche Eingabe sehr unterschiedlich ausfallen. Das folgende Beispiel demonstriert das Wandeln einer Benutzereingabe(String) in ein Datum(Date).
String trimmedUserInput = " 7.9 ".trim(); String[] datePatterns = {"dd.MM.", "ddMM", "dd.MM"}; String[] datePatternsWithYear = {"EE, dd.MM.yyyy", "dd.MM.yyyy", "ddMMyyyy"}; Date date = null; try { date = DateUtils.parseDate(trimmedUserInput, datePatternsWithYear); } catch (ParseException e) { try { date = DateUtils.parseDate(trimmedUserInput, datePatterns); date = DateUtils.setYears(date, GregorianCalendar.getInstance().get(Calendar.YEAR)); } catch (ParseException e1) { // Not a parseable date string e1.printStackTrace(); } } |
Als Eingabe sind viele verschiedene Formate gültig, z.B.: 0612, 6.12, 06.12., 06122009, … Alle diese Eingaben werden in ein gültiges Datum gewandelt: Sun Dec 06 00:00:00 CET 2009. Die Unterscheidung in zwei unterschiedliche Patterntypen erfolgt, da die parse-Methode bei fehlender Jahresangabe im Pattern leider nicht das aktuelle Jahr verwendet. Daher muss dieses nachträglich gesetzt werden.
Die Möglichkeit der parse-Methode mehrere Patterns zu übergeben, macht das Parsen von Benutzereingaben sehr komfortabel, besonders wenn verschiedene Locale-Standards, zum Beispiel neben dem deutschen auch das amerikanische Format (MM/dd/), erlaubt seien sollen.