日期实用工具类

来源:互联网 发布:流量优化 编辑:程序博客网 时间:2024/05/12 10:43

日期实用工具,我们在做统计功能的时候,经常要统计本周,本月,本季度,本年的数据,这就需要以某一天为基准,找出这些日期的范围;另外也有些方便的Date与String的转换函数。

import java.util.Date;
import java.util.Map;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;


/**
 * @author iori.ogami
 * @version 1.0 / 2005-06-30
 *
 */
public class DateUtil {

 public static final int HOUR = 1129 + 1;

 public static final int DATE = 1129 + 2;

 public static final int WEEK = 1129 + 3;

 public static final int MONTH = 1129 + 4;

 public static final int SEASON = 1129 + 5;

 public static final int YEAR = 1129 + 6;

 public static final String BEGIN = "begin";

 public static final String END = "end";

 /**
  * get the specified date range based on ref.
  * the range may be today, this week, this month,
  * this season or this year.
  *
  * @param ref:
  *   the benchmark of the range.
  * @param range:
  *   the range rounding the ref. 
  *   DAY, WEEK, MONTH, SEASON or YEAR.
  *  
  * @return
  *   a map with two entries, keyed BEGIN and END,
  *   whose values are of Date type and indicate
  *   the begin date and the end date of the range.
  */
 public static Map getDateRange(Date ref, int range) {
  Map m = new HashMap();
  Calendar cal = Calendar.getInstance();
  cal.setTime(ref);
  
  // this week
  if ( range == WEEK ) {
   int cnt = 0;
   for (; cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY; cnt++) {
    cal.add(Calendar.DATE, -1);
   }
   m.put( BEGIN, cal.getTime() );
   cal.add(Calendar.DATE, cnt);
   while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
    cal.add(Calendar.DATE, 1);
   }
   m.put( END, cal.getTime() );
  
  // this month
  } else if ( range == MONTH ) {
   cal.set(Calendar.DATE, 1);
   m.put(BEGIN, cal.getTime());
   
   int month = cal.get(Calendar.MONTH)+1;
   switch (month) {
   case 1:
   case 3:
   case 5:
   case 7:
   case 8:
   case 10:
   case 12:
    cal.set(Calendar.DATE, 31);
    break;
   case 4:
   case 6:
   case 9:
   case 11:
    cal.set(Calendar.DATE, 30);
    break;
   case 2:
    int year = cal.get(Calendar.YEAR);
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
     cal.set(Calendar.DATE, 29);
    } else {
     cal.set(Calendar.DATE, 28);
    }
    break;
   }
   m.put(END, cal.getTime());
   
  //this season 
  } else if ( range == SEASON ) {
   int year = cal.get(Calendar.YEAR);
   int month = cal.get(Calendar.MONTH);
   switch (month / 3) {
   case 0: //01-01 to 03-31
    cal.set(Calendar.MONTH,0);
    cal.set(Calendar.DATE,1);
    m.put(BEGIN, cal.getTime());
    cal.set(Calendar.MONTH,2);
    cal.set(Calendar.DATE,31);
    m.put(END, cal.getTime());
    break;
   case 1: //04-01 to 06-30
    cal.set(Calendar.MONTH,3);
    cal.set(Calendar.DATE,1);
    m.put(BEGIN, cal.getTime());
    cal.set(Calendar.MONTH,5);
    cal.set(Calendar.DATE,30);
    m.put(END, cal.getTime());

    break;
   case 2: //07-01 to 09-30
    cal.set(Calendar.MONTH,6);
    cal.set(Calendar.DATE,1);
    m.put(BEGIN, cal.getTime());
    cal.set(Calendar.MONTH,8);
    cal.set(Calendar.DATE,30);
    m.put(END, cal.getTime());
    break;
   case 3: // 10-01 to 12-31
    cal.set(Calendar.MONTH,9);
    cal.set(Calendar.DATE,1);
    m.put(BEGIN, cal.getTime());
    cal.set(Calendar.MONTH,11);
    cal.set(Calendar.DATE,31);
    m.put(END, cal.getTime());
    break;
   }
   
  // this year
  } else if ( range == YEAR ) {
   cal.set(Calendar.MONTH,0);
   cal.set(Calendar.DATE,1);
   m.put(BEGIN, cal.getTime());
   cal.set(Calendar.MONTH,11);
   cal.set(Calendar.DATE,31);
   m.put(END, cal.getTime());
  
  // default is DAY
  } else {
   m.put(BEGIN,cal.getTime());
   m.put(END,cal.getTime());
  }
  setTime(m); //optional
  return m;
 }

 
 /**
  * get the specified date range based on ref.
  * the range may be this week, this month,
  * this season or this year.
  *
  * @param ref:
  *   the benchmark of the range. a String of "yyyy-mm-dd" format.
  * @param range:
  *   the range rounding the ref. 
  *   WEEK, MONTH, SEASON or YEAR.
  *  
  * @return
  *   a map with two entries, keyed BEGIN and END,
  *   whose values are of Date type and indicate
  *   the begin date and the end date of the range.
  *   if the input string dosen't match "yyyy-M[M]-d[d]" format,
  *   null will be returned.
  */
 public static Map getDateRange(String ref, int range){
  if( !ref.matches("//d{4}-//d{1,2}-//d{1,2}") )
   return null;
  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.YEAR, Integer.parseInt( ref.split("-")[0]) );
  cal.set(Calendar.MONTH, Integer.parseInt( ref.split("-")[1])-1 );
  cal.set(Calendar.DATE, Integer.parseInt( ref.split("-")[2]) );
  Date d = cal.getTime();
  return getDateRange(d, range);
 }
 
 /**
  * convert a Date type variable to String type,
  * applying the specified format.
  *
  * @param d
  * @param format
  * @return
  */
 public static String dateToStr(Date d, String format){
  SimpleDateFormat df = (SimpleDateFormat) SimpleDateFormat
   .getDateInstance();
  df.applyPattern(format);
  return df.format(d);
 }
 
 /**
  * convert a Date type variable to String,
  * applying the "yyyy-MM-dd" format.
  *
  * @param d
  * @return
  */
 public static String dateToStr(Date d){
  return dateToStr(d, "yyyy-MM-dd");
 }
 
 /**
  * convert a String type variable to Date type.
  * this method only support the "yyyy-MM-dd" format,
  * if dosen't match, null will be returned.
  *
  * @param strDate
  * @return
  */
 public static Date strToDate(String strDate){
  if( !strDate.matches("//d{4}-//d{1,2}-//d{1,2}") )
   return null;
  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.YEAR, Integer.parseInt(strDate.split("-")[0]) );
  cal.set(Calendar.MONTH, Integer.parseInt(strDate.split("-")[1])-1 );
  cal.set(Calendar.DATE, Integer.parseInt(strDate.split("-")[2]) );
  return cal.getTime();
 }
 
 /**
  * set the begin time of the date range to 00:00:00,
  * and the end time of the date range to 23:59:59.
  * @param m:
  *   the date range map.
  */
 private static void setTime(Map m){
  Calendar cal = Calendar.getInstance();
  cal.setTime( (Date)m.get(BEGIN) );
  cal.set(Calendar.HOUR_OF_DAY,0);
  cal.set(Calendar.MINUTE,0);
  cal.set(Calendar.SECOND,0);
  m.put(BEGIN,cal.getTime());
  
  cal.setTime( (Date)m.get(END) );
  cal.set(Calendar.HOUR_OF_DAY,23);
  cal.set(Calendar.MINUTE,59);
  cal.set(Calendar.SECOND,59);
  m.put(END,cal.getTime());
 }
 
 public static void main(String args[]){
  System.out.println( getDateRange(new Date(), WEEK) );
 }
}