package com.spun.util;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import com.spun.util.logger.SimpleLogger;
/**
* A static class of convence functions for database access
**/
public class DateUtils
{
private static int TIME_SCALE[] = {Calendar.YEAR,
Calendar.MONTH,
Calendar.DATE,
Calendar.HOUR_OF_DAY,
Calendar.HOUR,
Calendar.MINUTE,
Calendar.SECOND,
Calendar.MILLISECOND};
/************************************************************************/
/**
*
**/
public static boolean isSame(Date firstDate, Date secondDate, int smallestUnits)
{
if ((firstDate == null) || (secondDate == null)) { return (firstDate == secondDate); }
return isSame(firstDate.getTime(), secondDate.getTime(), smallestUnits);
}
/************************************************************************/
/**
*
**/
public static boolean isSame(Calendar firstDate, Calendar secondDate, int smallestUnits)
{
if ((firstDate == null) || (secondDate == null)) { return (firstDate == secondDate); }
return isSame(firstDate.getTime().getTime(), secondDate.getTime().getTime(), smallestUnits);
}
/************************************************************************/
/**
*
**/
public static boolean isSame(Date firstDate, Calendar secondDate, int smallestUnits)
{
if ((firstDate == null) || (secondDate == null)) { return ((Object) firstDate == (Object) secondDate); }
return isSame(firstDate.getTime(), secondDate.getTime().getTime(), smallestUnits);
}
/************************************************************************/
/**
*
**/
public static boolean isSame(Calendar firstDate, Date secondDate, int smallestUnits)
{
if ((firstDate == null) || (secondDate == null)) { return ((Object) firstDate == (Object) secondDate); }
return isSame(firstDate.getTime().getTime(), secondDate.getTime(), smallestUnits);
}
/************************************************************************/
/**
*
**/
public static boolean isSame(long firstDate, long secondDate, int smallestUnits)
{
if (!ArrayUtils.contains(TIME_SCALE, smallestUnits)) { throw new Error("Invalid Timescale " + smallestUnits); }
GregorianCalendar first = new GregorianCalendar();
first.setTime(new Date(firstDate));
setSignificantDigit(first, smallestUnits);
GregorianCalendar second = new GregorianCalendar();
second.setTime(new Date(secondDate));
setSignificantDigit(second, smallestUnits);
// My_System.variable("Testing if " + first.getTime().getTime() + "==" + second.getTime().getTime());
return (first.getTime().getTime() == second.getTime().getTime());
}
/************************************************************************/
public static Timestamp getStartOfYear()
{
GregorianCalendar gregorianCalendar = new GregorianCalendar();
DateUtils.setSignificantDigit(gregorianCalendar, Calendar.YEAR);
return new Timestamp(gregorianCalendar.getTime().getTime());
}
/************************************************************************/
public static Timestamp getStartOfToday()
{
return getStartOfXDaysAgo(0);
}
/************************************************************************/
public static Timestamp getStartOfXDaysAgo(int numberOfDays)
{
return getStartOfXDaysAgo(numberOfDays, new Date());
}
/************************************************************************/
public static Timestamp getStartOfXDaysAgo(int numberOfDays, Date startingFrom)
{
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(startingFrom);
DateUtils.setSignificantDigit(gregorianCalendar, Calendar.DATE);
gregorianCalendar.add(Calendar.DATE, -numberOfDays);
return new Timestamp(gregorianCalendar.getTime().getTime());
}
/************************************************************************/
public static Calendar getEndOfTodayAsCalendar()
{
return rollToEndOfDay(new Date());
}
/************************************************************************/
public static Timestamp getEndOfToday()
{
return new Timestamp(getEndOfTodayAsCalendar().getTime().getTime());
}
/************************************************************************/
public static Calendar setSignificantDigit(Date date, int smallestUnits)
{
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(date.getTime());
return setSignificantDigit(calendar, smallestUnits);
}
/************************************************************************/
public static Calendar setSignificantDigit(Calendar calendar, int smallestUnits)
{
boolean removeOn = false;
for (int i = 0; i < TIME_SCALE.length; i++)
{
if (removeOn)
{
if (TIME_SCALE[i] == Calendar.DATE)
{
// Work arround since this is broke
calendar.set(TIME_SCALE[i], 1);
}
else if (TIME_SCALE[i] == Calendar.HOUR_OF_DAY)
{
// Work arround since this is broke
calendar.set(TIME_SCALE[i], 0);
}
else
{
calendar.clear(TIME_SCALE[i]);
}
}
if (TIME_SCALE[i] == smallestUnits)
{
removeOn = true;
}
}
return calendar;
}
/************************************************************************/
public static Timestamp getStartOf(int unit, Date forDate)
{
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(forDate);
setSignificantDigit(calendar, unit);
return new Timestamp(calendar.getTimeInMillis());
}
/************************************************************************/
public static Timestamp getEndOf(int unit, Date forDate)
{
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(forDate);
setSignificantDigit(calendar, unit);
calendar.add(unit, 1);
calendar.add(Calendar.MILLISECOND, -1);
return new Timestamp(calendar.getTimeInMillis());
}
/************************************************************************/
public static boolean areSame(Date date1, Date date2, long accuracy)
{
return (compareDates(date1, date2) < accuracy);
}
/************************************************************************/
/**
*
* @return 1 if date1 > date2, 0 if date1 = date2, -1 if date1 < date2
**/
public static int compareDates(Date date1, Date date2)
{
long l1 = ((date1 == null) ? 0 : date1.getTime());
long l2 = ((date2 == null) ? 0 : date2.getTime());
long diff = l1 - l2;
return (diff == 0) ? 0 : (int) (diff / Math.abs(diff));
}
/************************************************************************/
public static Date createTime(Date date)
{
Calendar time = new GregorianCalendar();
time.setTime(date);
time.set(1970, 0, 1);
return time.getTime();
}
/************************************************************************/
/**
* Rolls back till that time on a 24 hour clock
**/
public static Date rollTillHour(int hour, Date date)
{
Calendar rolled = new GregorianCalendar();
rolled.setTime(date);
setSignificantDigit(rolled, Calendar.HOUR_OF_DAY);
while (rolled.get(Calendar.HOUR_OF_DAY) != hour)
{
rolled.add(Calendar.HOUR_OF_DAY, -1);
}
return rolled.getTime();
}
/************************************************************************/
public static void main(String args[])
{
SimpleLogger.variable("Calendar.DATE = " + Calendar.DATE);
SimpleLogger.variable("Year", setSignificantDigit(new GregorianCalendar(), Calendar.YEAR).getTime());
SimpleLogger.variable("Month", setSignificantDigit(new GregorianCalendar(), Calendar.MONTH).getTime());
SimpleLogger.variable("Day", setSignificantDigit(new GregorianCalendar(), Calendar.DAY_OF_MONTH).getTime());
SimpleLogger.variable("Hour", setSignificantDigit(new GregorianCalendar(), Calendar.HOUR).getTime());
SimpleLogger.variable("Minute", setSignificantDigit(new GregorianCalendar(), Calendar.MINUTE).getTime());
SimpleLogger.variable("End Of Day", rollToEndOfDay(new Date()).getTime());
}
/************************************************************************/
public static GregorianCalendar rollToEndOfDay(Date date)
{
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(date);
gregorianCalendar.set(Calendar.HOUR_OF_DAY, 23);
gregorianCalendar.set(Calendar.MINUTE, 59);
gregorianCalendar.set(Calendar.SECOND, 59);
gregorianCalendar.set(Calendar.MILLISECOND, 999);
return gregorianCalendar;
}
/***********************************************************************/
public static Timestamp asTimestamp(Date date)
{
return new Timestamp(date.getTime());
}
/************************************************************************/
public static boolean isToday(Date date)
{
return DateUtils.isSame(date, new Date(), Calendar.DATE);
}
/************************************************************************/
public static Calendar asCalendar(Date date)
{
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(date);
return gregorianCalendar;
}
/************************************************************************/
public static Timestamp getLastOrCurrent(int dayOfWeek)
{
return getDayOfWeek(dayOfWeek, false);
}
/************************************************************************/
public static Timestamp getNextOrCurrent(int dayOfWeek)
{
return getDayOfWeek(dayOfWeek, true);
}
/************************************************************************/
private static Timestamp getDayOfWeek(int dayOfWeek, boolean foward) throws Error
{
int multiplier = foward ? -1 : 1;
for (int i = 0; i < 7; i++)
{
Timestamp day = getStartOfXDaysAgo(i * multiplier);
if (asCalendar(day).get(Calendar.DAY_OF_WEEK) == dayOfWeek) { return day; }
}
throw new Error(String.format("didn't find a %s in the %s 7 days", dayOfWeek, foward ? "next" : "last"));
}
/************************************************************************/
/**
* @param date "yyyy/MM/dd"
*/
public static Timestamp parse(String date)
{
SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy/MM/dd");
try
{
return asTimestamp(format.parse(date));
}
catch (ParseException e)
{
throw ObjectUtils.throwAsError(e);
}
}
/************************************************************************/
/************************************************************************/
public static boolean doesDaylightSavingsTimeStartOn(String date)
{
Timestamp day = parse(date);
TimeZone timeZone = GregorianCalendar.getInstance().getTimeZone();
boolean inDaylightTime = timeZone.inDaylightTime(day);
Calendar tomorrow = asCalendar(day);
tomorrow.add(Calendar.DATE, 1);
Date time = tomorrow.getTime();
return !inDaylightTime && timeZone.inDaylightTime(time);
}
}