package ch.vorburger.el.lib; import java.util.GregorianCalendar; /** * This class provides extensions for expressions that deal with the handling of dates. * * @author Kai Kreuzer * @author Michael Vorburger */ public class DateExtensions { public static GregorianCalendar parseDateTime(String dateTime) { int[] args = getGregorianCalendarConstructorArgs(dateTime); return new GregorianCalendar(args[0], args[1], args[2], args[3], args[4], args[5]); } public static int[] getGregorianCalendarConstructorArgs(String dateTime) { // I'm deliberately NOT using a DateFormat/SimpleDateFormat here... // Firstly because I really don't need it, hard-coded parsing is easier/faster; // Secondly SimpleDateFormat.parse() would give me a Date and not a GregorianCalendar/Calendar; // Thirdly and most importantly, BECAUSE DateFormat/SimpleDateFormat IS NOT THREAD-SAFE!!! // If you dear reader ever introduce a SimpleDateFormat here, do make sure that you really // truly understand what this means (use a new() DateFormat !), and beware of introduce subtle bugs!!! dateTime = dateTime.trim(); String[] segments = dateTime.split(" "); String date = segments[0]; String[] dateSegments = date.split("\\."); if(dateSegments.length!=3) { throw new RuntimeException("Date string is not valid, it should be in the format dd.mm.yy[yy]: " + date); } int dayOfMonth = Integer.parseInt(dateSegments[0]); int month = Integer.parseInt(dateSegments[1]); int year = -9999; int hourOfDay = 0; int minute = 0; int second = 0; year = Integer.parseInt(dateSegments[2]); if(segments.length > 1) { // we have a time as well String[] timeSegments = segments[1].split(":"); if(timeSegments.length!=3 || timeSegments[0].length()!=2 || timeSegments[1].length()!=2 || timeSegments[2].length()!=2) { throw new RuntimeException("Time string is not valid, it should be in the format hh.mm.ss: " + segments[1]); } hourOfDay = Integer.parseInt(timeSegments[0]); minute = Integer.parseInt(timeSegments[1]); second = Integer.parseInt(timeSegments[2]); } // Note "month -1", Java's GregorianCalendar is a bit strange... ;-) return new int[] { year, month - 1, dayOfMonth, hourOfDay, minute, second }; } }