/*\
* Copyright 2006 Klaus Rogall, Hamburg, Germany (klaus.rogall@web.de). All rights reserved.
* _____________________________________________________________________________________________________________________
*
* This class is "Open Source" as defined by the Open Source Initiative (OSI). You can redistribute it and/or modify it
* under the terms of the BSD License. The license text is appended to the end of this file.
\*/
package de.klaro.base.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Methoden zur Manupulation und Verarbeitung von Tagesdaten.
*
* TODO Methoden fr erste(n)/letzte(n) Sek./Min./Std./Tag/Mon. eines Datums
* TODO Untersttzung fr Zeitrume (auch offene); ggf. neuer Datentyp "Interval"/"Period" ==> intersects, contains, combine
* TODO Untersttzung fr before, before-or-equal, after, after-or-equal, ...
* TODO Untersttzung fr Uhrzeiten
*
* @see java.util.Date
* @see java.util.Calendar
* @see java.text.DateFormat
*/
public class Dates extends Object
{
/* ______________________________________________________________________________________________________________ *\
\* Konstanten */
private static final Calendar CALENDAR = Calendar.getInstance();
private static final Map<String,DateFormat> DATE_FORMATS = new HashMap<String,DateFormat>();
/* ______________________________________________________________________________________________________________ *\
\* Klassenvariablen */
/* ______________________________________________________________________________________________________________ *\
\* Instanzvariablen */
/* ______________________________________________________________________________________________________________ *\
\* Konstruktoren */
/**
* Erzeugt eine Instanz dieser Klasse.
*
* Da verhindert werden soll, dass Instanzen dieser Klasse ausserhalb dieser Klasse erzeugt werdem, ist dieser
* Konstruktor 'private' deklariert.
*/
private Dates()
{
super();
}
/* ______________________________________________________________________________________________________________ *\
\* Instanzmethoden */
/* ______________________________________________________________________________________________________________ *\
\* Klassenmethoden */
/**
* Verringert die Genauigkeit eines Datums, indem alle nicht relevanten Werte auf ihren jeweils kleinsten Wert
* gesetzt werden.
*
* Die Genauigkeit wird als eine der Konstanten aus der Klasse Calendar angegeben. Folgende Konstanten werden hier
* untersttzt: YEAR, MONTH, DATE, HOUR_OF_DAY, MINUTE, SECOND.
*
* @param date Das Datum
* @param precision Die Genauigkeit
* @return Das Datum mit verringerter Genauigkeit
* @see Calendar
*/
@SuppressWarnings("fallthrough")
public static Date trunc(Date date,int precision)
{
// Es ist (wahrscheinlich) schneller, die Methode synchron ablaufen zu lassen, als jedes Mal ein neues Calendar-Objekt zu erzeugen
synchronized (CALENDAR)
{
CALENDAR.setTime(date);
switch (precision)
{
// Hinweis: die folgenden Case-Statements enden absichtlich nicht mit einem Break-Statement
case Calendar.YEAR: CALENDAR.set(Calendar.MONTH,Calendar.JANUARY);
case Calendar.MONTH: CALENDAR.set(Calendar.DATE,1);
case Calendar.DATE: CALENDAR.set(Calendar.HOUR_OF_DAY,0);
case Calendar.HOUR_OF_DAY: CALENDAR.set(Calendar.MINUTE,0);
case Calendar.MINUTE: CALENDAR.set(Calendar.SECOND,0);
case Calendar.SECOND: CALENDAR.set(Calendar.MILLISECOND,0);
}
return CALENDAR.getTime();
}
}
/**
* Verringert die Genauigkeit des aktuellen Datums, indem alle nicht relevanten Werte auf ihren jeweils kleinsten
* Wert gesetzt werden.
*
* Die Genauigkeit wird als eine der Konstanten aus der Klasse Calendar angegeben. Folgende Konstanten werden hier
* untersttzt: YEAR, MONTH, DATE, HOUR_OF_DAY, MINUTE, SECOND.
*
* @param precision Die Genauigkeit
* @return Das Datum mit verringerter Genauigkeit
* @see Calendar
*/
public static Date truncNow(int precision)
{
return trunc(new Date(),precision);
}
/**
* Liefert das aktuelle Jahr als vierstelligen String.
*
* @return Das aktuelle Jahr
*/
public static String getCurrentYear()
{
return formatNow("yyyy");
}
/**
* Liefert den aktuellen Monat als zweistelligen String.
*
* @return Der aktuelle Monat
*/
public static String getCurrentMonth()
{
return formatNow("MM");
}
/**
* Liefert den aktuellen Tag im Monat als zweistelligen String.
*
* @return Der aktuelle Tag im Monat
*/
public static String getCurrentDay()
{
return formatNow("dd");
}
/**
* Liefert das aktuelle Datum und die Uhrzeit im angegebenen Format.
*
* Das Format muss entsprechend der Formatierungen der Klasse SimpleDateFormat angegeben werden.
*
* @param format Das Format
* @return Das aktuelle Datum entsprechend des Formats
* @see SimpleDateFormat
*/
public static String formatNow(String format)
{
return format(System.currentTimeMillis(),format);
}
/**
* Liefert ein Datum im angegebenen Format.
*
* Das Format muss entsprechend der Formatierungen der Klasse SimpleDateFormat angegeben werden.
*
* @param date Das Datum als Long-Ganzzahl
* @param format Das Format
* @return Das Datum entsprechend des Formats
* @see SimpleDateFormat
*/
public static String format(long date,String format)
{
DateFormat dateFormat = DATE_FORMATS.get(format);
if (dateFormat == null)
DATE_FORMATS.put(format,dateFormat = new SimpleDateFormat(format));
return dateFormat.format(date);
}
/**
* Liefert ein Datum im angegebenen Format.
*
* Das Format muss entsprechend der Formatierungen der Klasse SimpleDateFormat angegeben werden.
*
* @param date Das Datum
* @param format Das Format
* @return Das Datum entsprechend des Formats
* @see SimpleDateFormat
*/
public static String format(Date date,String format)
{
return format(date.getTime(),format);
}
/**
* Wandelt einen String in ein Datum um.
*
* Das Format muss entsprechend der Formatierungen der Klasse SimpleDateFormat angegeben werden.
*
* @param string Der String
* @param format Das Format
* @param defaultValue Der Default-Wert, der geliefert wird, wenn die Umwandlung fehlschlgt
* @return Das Datum als Long-Ganzzahl
* @see SimpleDateFormat
*/
public static long parse(CharSequence string,String format,long defaultValue)
{
return parse(string,format,new Date(defaultValue)).getTime();
}
/**
* Wandelt einen String in ein Datum um.
*
* Das Format muss entsprechend der Formatierungen der Klasse SimpleDateFormat angegeben werden.
*
* @param string Der String
* @param format Das Format
* @param defaultValue Der Default-Wert, der geliefert wird, wenn die Umwandlung fehlschlgt
* @return Das Datum
* @see SimpleDateFormat
*/
public static Date parse(CharSequence string,String format,Date defaultValue)
{
if (string == null)
{
return defaultValue;
}
DateFormat dateFormat = DATE_FORMATS.get(format);
if (dateFormat == null)
{
DATE_FORMATS.put(format,dateFormat = new SimpleDateFormat(format));
}
try
{
return dateFormat.parse(string.toString());
}
catch (ParseException e)
{
return defaultValue;
}
}
/**
* Transformiert ein Datum aus dem Util-Package in ein Datum aus dem SQL-Package.
*
* @param date Das Datum aus dem Util-Package
* @return Das Datum aus dem SQL-Package
*/
public static java.sql.Date toSQLDate(Date date)
{
return (date == null)? null: new java.sql.Date(date.getTime());
}
/* ______________________________________________________________________________________________________________ *\
\* Klassen */
}
/*\
* _____________________________________________________________________________________________________________________
*
* This software is distributed under the terms of the BSD License:
*
* Copyright 2006 Klaus Rogall, Hamburg, Germany (klaus.rogall@web.de). All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
* following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
* - Neither the name of the Klaus Rogall nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* _____________________________________________________________________________________________________________________
\*/