/*
* D E E P B L A C K B L O G L I C E N S E
*
*
* Copyright (c) 2001-2003 Timothy J. Kettering All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. 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.
*
* 3. The names "deepBlack" must not be used to endorse or promote
* products derived from this software without prior written
* permission. For written permission, please contact
* the copyright holder at tim@blackcore.com.
*
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
* ITS 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.
*
*/
import java.util.Date;
import java.util.TimeZone;
import java.util.GregorianCalendar;
import java.util.Calendar;
/**
* Date utility class file.
* @author timster@blackcore.com
* Nov 17, 2002
*
* @todo - Only the timestamp parameter methods have been tested somewhat
* extensively to be sure they return correct timestamps. The string
* and integer parameter methods need to be refined for accurate behavior, and
* better failsafes.
*
*/
public class DateUtility
{
/**
* Returns a primitive long which represents the timestamp of the first millisecond
* of the month matching the supplied parameters. This method assumes the
* default timezone.
* @param year
* @param month
* @return long
*/
static public long getFirstMilliOfMonth(String year, String month)
{
return getFirstMilliOfMonth(year, month, TimeZone.getDefault());
}
/**
* Returns a primitive long which represents the timestamp of the last millisecond
* of the month matching the supplied parameters. This method assumes the
* default timezone.
* @param year
* @param month
* @return long
*/
static public long getLastMilliOfMonth(String year, String month)
{
return getLastMilliOfMonth(year, month, TimeZone.getDefault());
}
/**
* This utility returns the first millsecond
* of the month, and year, and timezone supplied as arguments.
*
* @param String month
* @param String year
* @param TimeZone tz
* @return long
*/
static public long getFirstMilliOfMonth(String year, String month, TimeZone tz)
{
return getFirstMilliOfMonth(Integer.parseInt(year), Integer.parseInt(month), tz);
}
/**
* This utility returns the first millsecond
* of the month, and year, and timezone supplied as arguments.
*
* @param int month
* @param int year
* @param TimeZone tz
* @return long
*/
static public long getFirstMilliOfMonth(int year, int month, TimeZone tz)
{
GregorianCalendar cal = new GregorianCalendar(year, (month - 1), 1);
cal.setTimeZone(tz);
return cal.getTime().getTime();
}
/**
* This will retun the first millisecond of the month
* that contains the timestamp provided
* @param timestamp
* @return long
*/
static public long getFirstMilliOfMonth(long timestamp, TimeZone tz)
{
GregorianCalendar cal = new GregorianCalendar();
cal.setTimeZone(tz);
cal.setTime(new Date(timestamp));
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
Date date = cal.getTime();
return date.getTime();
}
/**
* Gets the last millsecond of the month, according to the timestamp and
* timezone arguments.
* @param timestamp
* @param tz
* @return long
*/
static public long getLastMilliOfMonth(long timestamp, TimeZone tz)
{
timestamp = getFirstMilliOfMonth(timestamp, tz);
GregorianCalendar cal = new GregorianCalendar();
cal.setTimeZone(tz);
cal.setTime(new Date(timestamp));
// now we'll roll the calendar forward one month.
// in the case of december, we need to roll forward the year too
if(cal.get(GregorianCalendar.MONTH) == GregorianCalendar.DECEMBER)
{
cal.roll(GregorianCalendar.YEAR, true);
}
cal.roll(GregorianCalendar.MONTH, true);
long date = cal.getTime().getTime();
date = date - 1L;
return date;
}
/**
* This utility returns the last millsecond
* of the month, and year, and timezone supplied as arguments.
*
* @param String month
* @param String year
* @param TimeZone tz
* @return long
*/
static public long getLastMilliOfMonth(String year, String month, TimeZone tz)
{
long time = getLastMilliOfMonth(Integer.parseInt(year), Integer.parseInt(month), tz);
return time;
}
/**
* This utility returns the last millsecond
* of the month, and year, and timezone supplied as arguments.
*
* @param int month
* @param int year
* @param TimeZone tz
* @return long
*/
static public long getLastMilliOfMonth(int year, int month, TimeZone tz)
{
GregorianCalendar cal = new GregorianCalendar(year, (month - 1), 1);
cal.setTimeZone(tz);
// set the maximum last day
int lastday = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
cal.set(GregorianCalendar.DAY_OF_MONTH, lastday);
// set other calendar maximums. - we should do this programatically
// too but i'm too lazy, and i dont think they're gonna change the gregorian
// calendar anytime soon.. eh?
cal.set(GregorianCalendar.HOUR_OF_DAY, 23);
cal.set(GregorianCalendar.MINUTE, 59);
cal.set(GregorianCalendar.SECOND, 59);
cal.set(GregorianCalendar.MILLISECOND, 999);
long time = cal.getTime().getTime();
return time;
}
}