Data Type Java

/* 
 *    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;
  } 
}