Autorenarchiv

DateTime Handling mit apache.commons.lang

Freitag, 23. Januar 2009

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.


Jan Kuenstler


Eclipse Shortcuts

Donnerstag, 26. Juni 2008

Eclipse bietet eine Fülle von Funktionen und nahezu so viele Shortcuts. Ich möchte ein paar (für mich) wichtige Shortcuts vorstellen, die vielleicht noch unbekannt sind.

Ein Überblick über die wichtigsten Shortcuts gibt es mit Hilfe von STRG+SHIFT+L, die Einstellungen finden sich im Menü unter Window→Preferences… General→Keys.

Besonders durch Firefox, aber auch durch andere Anwendungen, sind Tabs (”Reiter”) zur Organisation von mehreren Darstellungsflächen innerhalb einer Anwendung populär geworden.  Es etablierte sich der Quasistandard STRG+TAB für das Wechseln zwischen den einzelnen Darstellungen (STRG+SHIFT+TAB rückwärts). Das Wechseln zwischen verschiedenen Fenstern (ALT+TAB) verhält sich analog. Um dieses verhalten in Eclipse zu erreichen, müssen wir die Einstellungen von “Previous Editor” und “Next Editor” auf die gewünschte Tastenkombination stellen.

Besonders bei großen Projekten dauert es oft lange eine geöffnete Datei im “Package Explorer” zu lokalisieren. Dies erleichtert der Command “Show in menu”. Durch ALT+SHIFT+W erscheint ein Menü direkt am Cursor, in dem man “Package Explorer” auswählt. Dieser springt nun an die richtige Stelle. Nicht jedoch mit STRG+ALT+W zu verwechseln, dieses Kürzel schließt alle offenen Editoren.

Kennt man den Namen einer Resource, weiß aber nicht wo im Projekt sie zu finden ist hilft der Dialog “Open Resource”. Mit STRG+SHIFT+R öffnet sich eine Suchmaske mit sofortiger Rückmeldung.

Beim Erstellen neuer Klassen, gerade bei Datenhaltungs-Objekten (ValueObjects) mit vielen Intstanzvariablen, wird Programmieren zur reinen Schreibarbeit. Hier ist es sehr Hilfreich, dass Eclipse erlaubt, getter- und setter-Methoden sowie Kontruktoren zu generieren.  Mit ALT+SHIFT+S öffnet sich das “Source”-Menü, mit der Taste R wird der Dialog zum Generieren der getter und setter Methoden geöffnet (ALT+SHIFT+S, R). Ähnlich erreicht man den Dialog zum Erzeugen eines Constructors (ALT+SHIFT+S, O).

Welches sind eure am häufigsten genutzten Shortcuts (STRG+S zählt nicht)?


Jan Kuenstler