posts - 110, comments - 101, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
package com.alimama.common.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.alibaba.common.lang.StringUtil;

/**
 * 日期时间工具类,进行各种日期时间格式的转化以及格式化
 *
 * 
@author 李振华
 * 
@version v1.0.0
 
*/

public class DateTimeUtil {
   
public final static int TIME_DAY_MILLISECOND = 86400000;
    
// /
    
// 定义时间日期显示格式
    
// /
    private final static String DATE_FORMAT = "yyyy-MM-dd";

    
private final static String DATE_FORMAT_CN = "yyyy年MM月dd日";

    
private final static String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    
private final static String TIME_FORMAT_CN = "yyyy年MM月dd日 HH:mm:ss";

    
private final static String MONTH_FORMAT = "yyyy-MM";

    
private final static String DAY_FORMAT = "yyyyMMdd";

    
// private final static String TIME_FORMAT_MILLI = "yyyy-MM-dd
    
// HH:mm:ss.SSS";

    
/**
     * 取得当前系统时间,返回java.util.Date类型
     *
     * 
@see java.util.Date
     * 
@return java.util.Date 返回服务器当前系统时间
     
*/

    
public static java.util.Date getCurrDate() {
        
return new java.util.Date();
    }


    
/**
     * 取得当前系统时间戳
     *
     * 
@see java.sql.Timestamp
     * 
@return java.sql.Timestamp 系统时间戳
     
*/

    
public static java.sql.Timestamp getCurrTimestamp() {
        
return new java.sql.Timestamp(System.currentTimeMillis());
    }


    
/**
     * 将2007-12-1变成2007-12-01。将2007-9-1变为2007-09-01。
     *
     * 
@param date
     * 
@return
     
*/

    
public static String getFormatDateV2(String date) {
        
if (date == null{
            
return null;
        }


        String[] datearr 
= StringUtil.split(date, "-");
        
if (datearr == null || datearr.length != 3{
            
return date;
        }


        StringBuffer ret 
= new StringBuffer();
        ret.append(datearr[
0]);
        ret.append(
"-");
        ret.append(Integer.parseInt(datearr[
1]) < 10 ? "0" + Integer.parseInt(datearr[1]) : datearr[1]);
        ret.append(
"-");
        ret.append(Integer.parseInt(datearr[
2]) < 10 ? "0" + Integer.parseInt(datearr[2]) : datearr[2]);
        
return ret.toString();
    }


    
/**
     * 从时间串中获取小时数。
     *
     * 
@param timestr
     *                "2007-10-12 13:25:00"
     * 
@return
     
*/

    
public static int getHourFromTimeString(String timestr) {
        
if (StringUtil.isBlank(timestr)) {
            
return 0;
        }


        
return Integer.parseInt(timestr.substring(timestr.length() - 8, timestr.length() - 6));
    }


    
/**
     * 返回当前时间是上午还是下午
     *
     * 
@see Calendar.AM 0
     * 
@see Calendar.PM 1
     * 
@author lenghao
     * @createTime 2008-8-2 下午04:22:07
     * 
@return
     
*/

    
public static Integer getCurrDateAMorPM() {
        Calendar calendar 
= Calendar.getInstance();
        
return calendar.get(Calendar.AM_PM);
    }


    
/**
     * 得到格式化后的日期,格式为yyyy-MM-dd,如2006-02-15
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回格式化后的日期,默认格式为为yyyy-MM-dd,如2006-02-15
     
*/

    
public static String getFormatDate(java.util.Date currDate) {
        
return getFormatDate(currDate, DATE_FORMAT);
    }


    
/**
     * 得到格式化后的日期,格式为yyyy-MM-dd,如2006-02-15
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see #getFormatDate(java.util.Date)
     * 
@return Date 返回格式化后的日期,默认格式为为yyyy-MM-dd,如2006-02-15
     
*/

    
public static Date getFormatDateToDate(java.util.Date currDate) {
        
return getFormatDate(getFormatDate(currDate));
    }


    
/**
     * 得到格式化后的日期,格式为yyyy年MM月dd日,如2006年02月15日
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回格式化后的日期,默认格式为yyyy年MM月dd日,如2006年02月15日
     
*/

    
public static String getFormatDate_CN(java.util.Date currDate) {
        
return getFormatDate(currDate, DATE_FORMAT_CN);
    }


    
/**
     * 得到格式化后的日期,格式为yyyy年MM月dd日,如2006年02月15日
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see #getFormatDate_CN(String)
     * 
@return Date 返回格式化后的日期,默认格式为yyyy年MM月dd日,如2006年02月15日
     
*/

    
public static Date getFormatDateToDate_CN(java.util.Date currDate) {
        
return getFormatDate_CN(getFormatDate_CN(currDate));
    }


    
/**
     * 得到格式化后的日期,格式为yyyy-MM-dd,如2006-02-15
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see #getFormatDate(String, String)
     * 
@return Date 返回格式化后的日期,默认格式为yyyy-MM-dd,如2006-02-15
     
*/

    
public static Date getFormatDate(String currDate) {
        
return getFormatDate(currDate, DATE_FORMAT);
    }


    
/**
     * 得到格式化后的日期,格式为yyyy年MM月dd日,如2006年02月15日
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see #getFormatDate(String, String)
     * 
@return 返回格式化后的日期,默认格式为yyyy年MM月dd日,如2006年02月15日
     
*/

    
public static Date getFormatDate_CN(String currDate) {
        
return getFormatDate(currDate, DATE_FORMAT_CN);
    }


    
/**
     * 根据格式得到格式化后的日期
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@param format
     *                日期格式,如yyyy-MM-dd
     * 
@see java.text.SimpleDateFormat#format(java.util.Date)
     * 
@return String 返回格式化后的日期,格式由参数<code>format</code>
     *         定义,如yyyy-MM-dd,如2006-02-15
     
*/

    
public static String getFormatDate(java.util.Date currDate, String format) {
        
if (currDate == null{
            
return "";
        }

        SimpleDateFormat dtFormatdB 
= null;
        
try {
            dtFormatdB 
= new SimpleDateFormat(format);
            
return dtFormatdB.format(currDate);
        }
 catch (Exception e) {
            dtFormatdB 
= new SimpleDateFormat(DATE_FORMAT);
            
try {
                
return dtFormatdB.format(currDate);
            }
 catch (Exception ex) {
            }

        }

        
return null;
    }


    
/**
     * 得到格式化后的时间,格式为yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45
     *
     * 
@param currDate
     *                要格式化的时间
     * 
@see #getFormatDateTime(java.util.Date, String)
     * 
@return String 返回格式化后的时间,默认格式为yyyy-MM-dd HH:mm:ss,如2006-02-15
     *         15:23:45
     
*/

    
public static String getFormatDateTime(java.util.Date currDate) {
        
return getFormatDateTime(currDate, TIME_FORMAT);
    }


    
/**
     * 得到格式化后的时间,格式为yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45
     *
     * 
@param currDate
     *                要格式环的时间
     * 
@see #getFormatDateTime(String)
     * 
@return Date 返回格式化后的时间,默认格式为yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45
     
*/

    
public static Date getFormatDateTimeToTime(java.util.Date currDate) {
        
return getFormatDateTime(getFormatDateTime(currDate));
    }


    
/**
     * 得到格式化后的时间,格式为yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45
     *
     * 
@param currDate
     *                要格式化的时间
     * 
@see #getFormatDateTime(String, String)
     * 
@return Date 返回格式化后的时间,默认格式为yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45
     
*/

    
public static Date getFormatDateTime(String currDate) {
        
return getFormatDateTime(currDate, TIME_FORMAT);
    }


    
/**
     * 得到格式化后的时间,格式为yyyy年MM月dd日 HH:mm:ss,如2006年02月15日 15:23:45
     *
     * 
@param currDate
     *                要格式化的时间
     * 
@see #getFormatDateTime(java.util.Date, String)
     * 
@return String 返回格式化后的时间,默认格式为yyyy年MM月dd日 HH:mm:ss,如2006年02月15日
     *         15:23:45
     
*/

    
public static String getFormatDateTime_CN(java.util.Date currDate) {
        
return getFormatDateTime(currDate, TIME_FORMAT_CN);
    }


    
/**
     * 得到格式化后的时间,格式为yyyy年MM月dd日 HH:mm:ss,如2006年02月15日 15:23:45
     *
     * 
@param currDate
     *                要格式化的时间
     * 
@see #getFormatDateTime_CN(String)
     * 
@return Date 返回格式化后的时间,默认格式为yyyy年MM月dd日 HH:mm:ss,如2006年02月15日
     *         15:23:45
     
*/

    
public static Date getFormatDateTimeToTime_CN(java.util.Date currDate) {
        
return getFormatDateTime_CN(getFormatDateTime_CN(currDate));
    }


    
/**
     * 得到格式化后的时间,格式为yyyy年MM月dd日 HH:mm:ss,如2006年02月15日 15:23:45
     *
     * 
@param currDate
     *                要格式化的时间
     * 
@see #getFormatDateTime(String, String)
     * 
@return Date 返回格式化后的时间,默认格式为yyyy年MM月dd日 HH:mm:ss,如2006年02月15日
     *         15:23:45
     
*/

    
public static Date getFormatDateTime_CN(String currDate) {
        
return getFormatDateTime(currDate, TIME_FORMAT_CN);
    }


    
/**
     * 根据格式得到格式化后的时间
     *
     * 
@param currDate
     *                要格式化的时间
     * 
@param format
     *                时间格式,如yyyy-MM-dd HH:mm:ss
     * 
@see java.text.SimpleDateFormat#format(java.util.Date)
     * 
@return String 返回格式化后的时间,格式由参数<code>format</code>定义,如yyyy-MM-dd
     *         HH:mm:ss
     
*/

    
public static String getFormatDateTime(java.util.Date currDate, String format) {
        
if (currDate == null{
            
return "";
        }

        SimpleDateFormat dtFormatdB 
= null;
        
try {
            dtFormatdB 
= new SimpleDateFormat(format);
            
return dtFormatdB.format(currDate);
        }
 catch (Exception e) {
            dtFormatdB 
= new SimpleDateFormat(TIME_FORMAT);
            
try {
                
return dtFormatdB.format(currDate);
            }
 catch (Exception ex) {
            }

        }

        
return "";
    }


    
/**
     * 根据格式得到格式化后的日期
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@param format
     *                日期格式,如yyyy-MM-dd
     * 
@see java.text.SimpleDateFormat#parse(java.lang.String)
     * 
@return Date 返回格式化后的日期,格式由参数<code>format</code>
     *         定义,如yyyy-MM-dd,如2006-02-15
     
*/

    
public static Date getFormatDate(String currDate, String format) {
        
if (currDate == null{
            
return null;
        }

        SimpleDateFormat dtFormatdB 
= null;
        
try {
            dtFormatdB 
= new SimpleDateFormat(format);
            
return dtFormatdB.parse(currDate);
        }
 catch (Exception e) {
            dtFormatdB 
= new SimpleDateFormat(DATE_FORMAT);
            
try {
                
return dtFormatdB.parse(currDate);
            }
 catch (Exception ex) {
            }

        }

        
return null;
    }


    
/**
     * 根据格式得到格式化后的时间
     *
     * 
@param currDate
     *                要格式化的时间
     * 
@param format
     *                时间格式,如yyyy-MM-dd HH:mm:ss
     * 
@see java.text.SimpleDateFormat#parse(java.lang.String)
     * 
@return Date 返回格式化后的时间,格式由参数<code>format</code>定义,如yyyy-MM-dd
     *         HH:mm:ss
     
*/

    
public static Date getFormatDateTime(String currDate, String format) {
        
if (currDate == null{
            
return null;
        }

        SimpleDateFormat dtFormatdB 
= null;
        
try {
            dtFormatdB 
= new SimpleDateFormat(format);
            
return dtFormatdB.parse(currDate);
        }
 catch (Exception e) {
            dtFormatdB 
= new SimpleDateFormat(TIME_FORMAT);
            
try {
                
return dtFormatdB.parse(currDate);
            }
 catch (Exception ex) {
            }

        }

        
return null;
    }


    
/**
     * 得到本日的上月时间 如果当日为2007-9-1,那么获得2007-8-1
     
*/

    
public static String getDateBeforeMonth() {
        Calendar cal 
= Calendar.getInstance();
        cal.add(Calendar.MONTH, 
-1);
        
return getFormatDate(cal.getTime(), DATE_FORMAT);
    }


    
/**
     * 得到本日的前几个月时间 如果number=2当日为2007-9-1,那么获得2007-7-1
     
*/

    
public static String getDateBeforeMonth(int number) {
        Calendar cal 
= Calendar.getInstance();
        cal.add(Calendar.MONTH, 
-number);
        
return getFormatDate(cal.getTime(), DATE_FORMAT);
    }


    
public static long getDaysOfDates(Date first, Date second) {
        Date d1 
= getFormatDateTime(getFormatDate(first), DATE_FORMAT);
        Date d2 
= getFormatDateTime(getFormatDate(second), DATE_FORMAT);

        
long mils = d1.getTime() - d2.getTime();

        
return mils / (TIME_DAY_MILLISECOND);
    }


    
/**
     * 获得两个Date型日期之间相差的天数(第2个减第1个)
     *
     * 
@param Date
     *                first, Date second
     * 
@return int 相差的天数
     
*/

    
public static int getDaysBetweenDates(Date first, Date second) {
        Date d1 
= getFormatDateTime(getFormatDate(first), DATE_FORMAT);
        Date d2 
= getFormatDateTime(getFormatDate(second), DATE_FORMAT);

        Long mils 
= (d2.getTime() - d1.getTime()) / (TIME_DAY_MILLISECOND);

        
return mils.intValue();
    }


    
/**
     * 获得两个String型日期之间相差的天数(第2个减第1个)
     *
     * 
@param String
     *                first, String second
     * 
@return int 相差的天数
     
*/

    
public static int getDaysBetweenDates(String first, String second) {
        Date d1 
= getFormatDateTime(first, DATE_FORMAT);
        Date d2 
= getFormatDateTime(second, DATE_FORMAT);

        Long mils 
= (d2.getTime() - d1.getTime()) / (TIME_DAY_MILLISECOND);

        
return mils.intValue();
    }


    
/**
     * 
@author lenghao
     * @createTime 2008-8-5 下午01:57:09
     * 
@param first
     * 
@param second
     * 
@return 获取两个Date之间的天数的列表
     
*/

    
public static List<Date> getDaysListBetweenDates(Date first, Date second) {
        List
<Date> dateList = new ArrayList<Date>();
        Date d1 
= getFormatDateTime(getFormatDate(first),DATE_FORMAT);
        Date d2 
= getFormatDateTime(getFormatDate(second),DATE_FORMAT);
        
if(d1.compareTo(d2)>0{
            
return dateList;
        }

        
do {
            dateList.add(d1);
            d1 
= getDateBeforeOrAfter(d1, 1);
        }
 while (d1.compareTo(d2) <= 0);
        
return dateList;
    }


    
/**
     *
     *
     
*/

    
public static String getDateBeforeDay() {
        Calendar cal 
= Calendar.getInstance();
        cal.add(Calendar.DAY_OF_YEAR, 
-1);
        
return getFormatDate(cal.getTime(), DATE_FORMAT);
    }


    
/**
     * 得到格式化后的当前系统日期,格式为yyyy-MM-dd,如2006-02-15
     *
     * 
@see #getFormatDate(java.util.Date)
     * 
@return String 返回格式化后的当前服务器系统日期,格式为yyyy-MM-dd,如2006-02-15
     
*/

    
public static String getCurrDateStr() {
        
return getFormatDate(getCurrDate());
    }


    
/**
     * 得到格式化后的当前系统时间,格式为yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45
     *
     * 
@see #getFormatDateTime(java.util.Date)
     * 
@return String 返回格式化后的当前服务器系统时间,格式为yyyy-MM-dd HH:mm:ss,如2006-02-15
     *         15:23:45
     
*/

    
public static String getCurrDateTimeStr() {
        
return getFormatDateTime(getCurrDate());
    }


    
/**
     * 得到格式化后的当前系统日期,格式为yyyy年MM月dd日,如2006年02月15日
     *
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回当前服务器系统日期,格式为yyyy年MM月dd日,如2006年02月15日
     
*/

    
public static String getCurrDateStr_CN() {
        
return getFormatDate(getCurrDate(), DATE_FORMAT_CN);
    }


    
/**
     * 得到格式化后的当前系统时间,格式为yyyy年MM月dd日 HH:mm:ss,如2006年02月15日 15:23:45
     *
     * 
@see #getFormatDateTime(java.util.Date, String)
     * 
@return String 返回格式化后的当前服务器系统时间,格式为yyyy年MM月dd日 HH:mm:ss,如2006年02月15日
     *         15:23:45
     
*/

    
public static String getCurrDateTimeStr_CN() {
        
return getFormatDateTime(getCurrDate(), TIME_FORMAT_CN);
    }


    
/**
     * 得到系统当前日期的前或者后几天
     *
     * 
@param iDate
     *                如果要获得前几天日期,该参数为负数; 如果要获得后几天日期,该参数为正数
     * 
@see java.util.Calendar#add(int, int)
     * 
@return Date 返回系统当前日期的前或者后几天
     
*/

    
public static Date getDateBeforeOrAfter(int iDate) {
        Calendar cal 
= Calendar.getInstance();
        cal.add(Calendar.DAY_OF_MONTH, iDate);
        
return cal.getTime();
    }


    
/**
     * 得到日期的前或者后几天
     *
     * 
@param iDate
     *                如果要获得前几天日期,该参数为负数; 如果要获得后几天日期,该参数为正数
     * 
@see java.util.Calendar#add(int, int)
     * 
@return Date 返回参数<code>curDate</code>定义日期的前或者后几天
     
*/

    
public static Date getDateBeforeOrAfter(Date curDate, int iDate) {
        Calendar cal 
= Calendar.getInstance();
        cal.setTime(curDate);
        cal.add(Calendar.DAY_OF_MONTH, iDate);
        
return cal.getTime();
    }


    
/**
     * 得到格式化后的月份,格式为yyyy-MM,如2006-02
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回格式化后的月份,格式为yyyy-MM,如2006-02
     
*/

    
public static String getFormatMonth(java.util.Date currDate) {
        
return getFormatDate(currDate, MONTH_FORMAT);
    }


    
/**
     * 得到格式化后的日,格式为yyyyMMdd,如20060210
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回格式化后的日,格式为yyyyMMdd,如20060210
     
*/

    
public static String getFormatDay(java.util.Date currDate) {
        
return getFormatDate(currDate, DAY_FORMAT);
    }


    
/**
     * 得到格式化后的当月第一天,格式为yyyy-MM-dd,如2006-02-01
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see java.util.Calendar#getMinimum(int)
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回格式化后的当月第一天,格式为yyyy-MM-dd,如2006-02-01
     
*/

    
public static String getFirstDayOfMonth() {
        Calendar cal 
= Calendar.getInstance();
        
int firstDay = cal.getMinimum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DAY_OF_MONTH, firstDay);
        
return getFormatDate(cal.getTime(), DATE_FORMAT);
    }


    
/**
     * 得到格式化后的下月第一天,格式为yyyy-MM-dd,如2006-02-01
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see java.util.Calendar#getMinimum(int)
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回格式化后的下月第一天,格式为yyyy-MM-dd,如2006-02-01
     
*/

    
public static String getFirstDayOfNextMonth() {
        Calendar cal 
= Calendar.getInstance();
        cal.add(Calendar.MONTH, 
+1);
        
int firstDay = cal.getMinimum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DAY_OF_MONTH, firstDay);
        
return getFormatDate(cal.getTime(), DATE_FORMAT);
    }


    
/**
     * 得到格式化后的当月第一天,格式为yyyy-MM-dd,如2006-02-01
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see java.util.Calendar#getMinimum(int)
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回格式化后的当月第一天,格式为yyyy-MM-dd,如2006-02-01
     
*/

    
public static String getFirstDayOfMonth(Date currDate) {
        Calendar cal 
= Calendar.getInstance();
        cal.setTime(currDate);
        
int firstDay = cal.getMinimum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DAY_OF_MONTH, firstDay);
        
return getFormatDate(cal.getTime(), DATE_FORMAT);
    }


    
/**
     * 得到格式化后的当月最后一天,格式为yyyy-MM-dd,如2006-02-28
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see java.util.Calendar#getMinimum(int)
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回格式化后的当月最后一天,格式为yyyy-MM-dd,如2006-02-28
     
*/

    
public static String getLastDayOfMonth(Date currDate) {
        Calendar cal 
= Calendar.getInstance();
        cal.setTime(currDate);
        
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        
return getFormatDate(cal.getTime(), DATE_FORMAT);
    }


    
/**
     * 得到格式化后的当月最后一天,格式为yyyy-MM-dd,如2006-02-28
     *
     * 
@param currDate
     *                要格式化的日期
     * 
@see java.util.Calendar#getMinimum(int)
     * 
@see #getFormatDate(java.util.Date, String)
     * 
@return String 返回格式化后的当月最后一天,格式为yyyy-MM-dd,如2006-02-28
     
*/

    
public static String getLastDayOfMonth() {
        Calendar cal 
= Calendar.getInstance();
        
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        
return getFormatDate(cal.getTime(), DATE_FORMAT);
    }


    
/**
     * 得到日期的前或者后几小时
     *
     * 
@param iHour
     *                如果要获得前几小时日期,该参数为负数; 如果要获得后几小时日期,该参数为正数
     * 
@see java.util.Calendar#add(int, int)
     * 
@return Date 返回参数<code>curDate</code>定义日期的前或者后几小时
     
*/

    
public static Date getDateBeforeOrAfterHours(Date curDate, int iHour) {
        Calendar cal 
= Calendar.getInstance();
        cal.setTime(curDate);
        cal.add(Calendar.HOUR_OF_DAY, iHour);
        
return cal.getTime();
    }


    
/**
     * 判断日期是否在当前周内
     *
     * 
@param curDate
     * 
@param compareDate
     * 
@return
     
*/

    
public static boolean isSameWeek(Date curDate, Date compareDate) {
        
if (curDate == null || compareDate == null{
            
return false;
        }


        Calendar calSun 
= Calendar.getInstance();
        calSun.setTime(getFormatDateToDate(curDate));
        calSun.set(Calendar.DAY_OF_WEEK, 
1);

        Calendar calNext 
= Calendar.getInstance();
        calNext.setTime(calSun.getTime());
        calNext.add(Calendar.DATE, 
7);

        Calendar calComp 
= Calendar.getInstance();
        calComp.setTime(compareDate);
        
if (calComp.after(calSun) && calComp.before(calNext)) {
            
return true;
        }
 else {
            
return false;
        }

    }


    
/**
     * 时间查询时,结束时间的 23:59:59
     
*/

    
public static String addDateEndfix(String datestring) {
        
if ((datestring == null|| datestring.equals("")) {
            
return null;
        }

        
return datestring + " 23:59:59";
    }


    
/**
     * 返回格式化的日期
     *
     * 
@param datePre
     *                格式"yyyy-MM-dd 23:59:59";
     * 
@return
     
*/

    
public static Date getFormatDateEndfix(String dateStr) {
        dateStr 
= addDateEndfix(dateStr);
        
return getFormatDateTime(dateStr);
    }


    
/**
     * 返回格式化的日期
     *
     * 
@param datePre
     *                格式"yyyy-MM-dd HH:mm:ss";
     * 
@return
     
*/

    
public static Date formatEndTime(String datePre) {
        
if (datePre == null)
            
return null;
        String dateStr 
= addDateEndfix(datePre);
        
return getFormatDateTime(dateStr);
    }


    
// date1加上compday天数以后的日期与当前时间比较,如果大于当前时间返回true,否则false
    public static Boolean compareDay(Date date1, int compday) {
        
if (date1 == null)
            
return false;
        Date dateComp 
= getDateBeforeOrAfter(date1, compday);
        Date nowdate 
= new Date();
        
if (dateComp.after(nowdate))
            
return true;
        
else
            
return false;
    }


    
/**
     * 进行时段格式转换,对于输入的48位的01串,将进行如下操作: <li>
     * 1.先将输入中每个0变成两个0,每个1变成2个1,形成一个96位的二进制串。</li> <li>
     * 2.将上述的96位的二进制串分成3组,每组32位。</li> <li>3.将每个32位的二进制串转换成一个8位的16进制串。</li>
     * <li>4.将3个8位的16进制串合并成一个串,中间以","分割。</li>
     *
     * 
@param timespan
     *                一个48位的二进制串,如:"011111111011111111111111111111111111111111111110"
     * 
@return 一个16进制串,每位间以","分割。如:"3fffcfff,ffffffff,fffffffc"
     
*/

    
public static String convertBinaryTime2Hex(String timespan) {
        
if (timespan == null || timespan.equals("")) {
            
return "";
        }


        String ret 
= "";
        String tmp 
= "";
        
for (int i = 0; i < timespan.length(); i++{
            tmp 
+= timespan.charAt(i);
            tmp 
+= timespan.charAt(i);
            
// tmp += i;
            if ((i + 1% 16 == 0{
                
if (!ret.equals("")) {
                    ret 
+= ",";
                }

                Long t 
= Long.parseLong(tmp, 2);
                String hexStr 
= Long.toHexString(t);
                
if (hexStr.length() < 8{
                    
int length = hexStr.length();
                    
for (int n = 0; n < 8 - length; n++{
                        hexStr 
= "0" + hexStr;
                    }

                }


                ret 
+= hexStr;
                tmp 
= "";
            }

        }


        
return ret;
    }


    
/**
     * 进行时段格式转换,将输入的26位的2进制串转换成48位的二进制串。
     *
     * 
@param timespan
     *                一个16进制串,每位间以","分割。如:"3fffcfff,ffffffff,fffffffc"
     * 
@return
     *         一个48位的二进制串,如:"011111111011111111111111111111111111111111111110"
     
*/

    
public static String convertHexTime2Binary(String timespan) {
        
if (timespan == null || timespan.equals("")) {
            
return "";
        }


        String tmp 
= "";
        String ret 
= "";
        String[] strArr 
= timespan.split(",");
        
for (int i = 0; i < strArr.length; i++{
            String binStr 
= Long.toBinaryString(Long.parseLong(strArr[i], 16));
            
if (binStr.length() < 32{
                
int length = binStr.length();
                
for (int n = 0; n < 32 - length; n++{
                    binStr 
= "0" + binStr;
                }

            }

            tmp 
+= binStr;
        }


        
for (int i = 0; i < 48; i++{
            ret 
+= tmp.charAt(i * 2);
        }


        
return ret;
    }


    
/**
     * 进行时段格式转换,将输入的32位的10进制串转换成48位的二进制串。
     *
     * 
@param timespan
     *                一个16进制串,每位间以","分割。如:"1234567890,1234567890,1234567890c"
     * 
@return
     *         一个48位的二进制串,如:"011111111011111111111111111111111111111111111110"
     
*/

    
public static String convertDecTime2Binary(String timespan) {
        
if (timespan == null || timespan.equals("")) {
            
return "";
        }


        String tmp 
= "";
        String ret 
= "";
        String[] strArr 
= timespan.split(",");
        
for (int i = 0; i < strArr.length; i++{
            String binStr 
= Long.toBinaryString(Long.parseLong(strArr[i], 10));
            
if (binStr.length() < 32{
                
int length = binStr.length();
                
for (int n = 0; n < 32 - length; n++{
                    binStr 
= "0" + binStr;
                }

            }

            tmp 
+= binStr;
        }


        
for (int i = 0; i < 48; i++{
            ret 
+= tmp.charAt(i * 2);
        }


        
return ret;
    }


    
/**
     * 进行时段格式转换,对于输入的48位的01串,将进行如下操作: <li>
     * 1.先将输入中每个0变成两个0,每个1变成2个1,形成一个96位的二进制串。</li> <li>
     * 2.将上述的96位的二进制串分成3组,每组32位。</li> <li>3.将每个32位的二进制串转换成一个10位的10进制串。</li>
     * <li>4.将3个8位的16进制串合并成一个串,中间以","分割。</li>
     *
     * 
@param timespan
     *                一个48位的二进制串,如:"011111111011111111111111111111111111111111111110"
     * 
@return 一个16进制串,每位间以","分割。如:"1234567890,1234567890,1234567890"
     
*/

    
public static String convertBinaryTime2Dec(String timespan) {
        
if (timespan == null || timespan.equals("")) {
            
return "";
        }


        String ret 
= "";
        String tmp 
= "";
        
for (int i = 0; i < timespan.length(); i++{
            tmp 
+= timespan.charAt(i);
            tmp 
+= timespan.charAt(i);
            
// tmp += i;
            if ((i + 1% 16 == 0{
                
if (!ret.equals("")) {
                    ret 
+= ",";
                }

                Long t 
= Long.parseLong(tmp, 2);
                String decStr 
= Long.toString(t);
                
if (decStr.length() < 10{
                    
int length = decStr.length();
                    
for (int n = 0; n < 10 - length; n++{
                        decStr 
= "0" + decStr;
                    }

                }


                ret 
+= decStr;
                tmp 
= "";
            }

        }


        
return ret;
    }


    
/**
     * 计算指定日期+addMonth月+15号 返回格式"2008-02-15"
     *
     * 
@param date
     * 
@param addMonth
     * 
@param monthDay
     * 
@return
     
*/

    
public static String genericSpecdate(Date date, int addMonth, int monthDay) {
        Calendar cal 
= Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, addMonth);
        cal.set(Calendar.DAY_OF_MONTH, monthDay);
        
return getFormatDate(cal.getTime(), DATE_FORMAT);
    }


    
/**
     * 获得以今天为单位若干天以前或以后的日期的标准格式"Wed Feb 20 00:00:00 CST 2008",是0点0分0秒。
     *
     * 
@param idx
     * 
@return
     
*/

    
public static Date getDateBeforeOrAfterV2(int idx) {
        
return getDateBeforeOrAfter(getFormatDateToDate(getCurrDate()), idx);
    }


    
/**
     * 获得给定时间若干秒以前或以后的日期的标准格式。
     *
     * 
@param curDate
     * 
@param seconds
     * 
@return curDate
     
*/

    
public static Date getSpecifiedDateTimeBySeconds(Date curDate, int seconds) {
        
long time = (curDate.getTime() / 1000+ seconds;
        curDate.setTime(time 
* 1000);
        
return curDate;
    }


    
/**
     * 获得给定日期当天23点59分59秒的标准格式。
     *
     * 
@param curDate
     * 
@return curDate
     
*/

    
public static Date getSpecifiedDateTime_235959(Date curDate) {
        
return getSpecifiedDateTimeBySeconds(getFormatDateToDate(curDate), 24 * 60 * 60 - 1);
    }


    
public static String getSpecifiedDateTime_month(Date curDate) {
        
return getFormatDateTime(curDate, "MM.dd");
    }


    
// change by bbq
    public static final String dtSimple = "yyyy-MM-dd";

    
private static final Object[] Date = null;

    
/**
     * alahan add 20050825 获取传入时间相差的日期
     *
     * 
@param dt
     *                传入日期,可以为空
     * 
@param diff
     *                需要获取相隔diff天的日期 如果为正则取以后的日期,否则时间往前推
     * 
@return
     
*/

    
public static String getDiffStringDate(Date dt, int diff) {
        Calendar ca 
= Calendar.getInstance();

        
if (dt == null{
            ca.setTime(
new Date());
        }
 else {
            ca.setTime(dt);
        }


        ca.add(Calendar.DATE, diff);
        
return dtSimpleFormat(ca.getTime());
    }


    
/**
     * yyyy-MM-dd
     *
     * 
@param date
     * 
@return
     
*/

    
public static final String dtSimpleFormat(Date date) {
        
if (date == null{
            
return "";
        }


        
return getFormat(dtSimple).format(date);
    }


    
// SimpleDateFormat("yyyy-MM-dd HH:mm");
    private static final DateFormat getFormat(String format) {
        
return new SimpleDateFormat(format);
    }


    
/**
     * 取得多个日期中间隔的最大天数
     *
     * 
@author Alvise
     * 
@param startDateAndEndDate
     * 
@return
     
*/

    
public static int maxContinuousDays(Date[][] startDateAndEndDate) {
        
// 冒泡排序
        for (int i = 0; i < startDateAndEndDate.length - 1; i++{
            
for (int j = 0; j < startDateAndEndDate.length - i - 1; j++{
                
if (DateTimeUtil.getDaysBetweenDates(startDateAndEndDate[j + 1][0],
                        startDateAndEndDate[j][
0]) > 0{
                    Date[] tempDate 
= startDateAndEndDate[j];
                    startDateAndEndDate[j] 
= startDateAndEndDate[j + 1];
                    startDateAndEndDate[j 
+ 1= tempDate;
                }

            }

        }


//         for (int i = 0; i < startDateAndEndDate.length; i++) {
//         if (startDateAndEndDate[i][0] == null)
//         break;
//         System.out.println(DateTimeUtil.getFormatDate(
//         startDateAndEndDate[i][0]) + ","
//         + DateTimeUtil.getFormatDate(startDateAndEndDate[i][1]));
//         }
//
//         System.out.println(
//         "===========================================");

        
// 合并连续的时间段
        int j = 0;
        Date[][] startDateAndEndDateNew 
= new Date[startDateAndEndDate.length][2];
        
for (int i = 0; i < startDateAndEndDateNew.length ; i++{
            
if (j >= startDateAndEndDate.length)
                
break;

            startDateAndEndDateNew[i] 
= startDateAndEndDate[j];
            j
++;
            
while (j < startDateAndEndDate.length) {
                
if (DateTimeUtil.getDaysBetweenDates(startDateAndEndDateNew[i][1],
                        startDateAndEndDate[j][
0]) > 0{
                    
break;
                }
 else if (DateTimeUtil.getDaysBetweenDates(startDateAndEndDateNew[i][1],
                        startDateAndEndDate[j][
1]) > 0{
                    startDateAndEndDateNew[i][
1= startDateAndEndDate[j][1];
                    j
++;
                }
 else if (DateTimeUtil.getDaysBetweenDates(startDateAndEndDateNew[i][1],
                        startDateAndEndDate[j][
1]) <= 0{
                    j
++;
                }


            }

        }


//         for (int i = 0; i < startDateAndEndDateNew.length; i++) {
//            if (startDateAndEndDateNew[i][0] == null)
//                break;
//            System.out.println(DateTimeUtil.getFormatDate(startDateAndEndDateNew[i][0]) + ","
//                    + DateTimeUtil.getFormatDate(startDateAndEndDateNew[i][1]));
//        }

        
// 选择法排序
        int maxDays = 0;
        
for (int i = 0; i < startDateAndEndDateNew.length - 1; i++{
            Date curEndDate 
= startDateAndEndDateNew[i][1];
            Date nextStartDate 
= startDateAndEndDateNew[i + 1][0];
            
if (curEndDate == null || nextStartDate == null{
                
break;
            }


            
int temDays = DateTimeUtil.getDaysBetweenDates(curEndDate, nextStartDate);
            
if (temDays > maxDays) {
                maxDays 
= temDays;
            }

        }

        
return maxDays;
    }


    
/**
     * 取得多个日期中间隔的最大天数,这里的参数是用 ","和";"分割的字符字符串例如 "2008-08-03,2008-08-04;"
     *
     * 
@author Alvise
     * 
@param startDateAndEndDate
     * 
@return
     
*/

    
public static int maxContinuousDays(String dateStr) {
        String[] seDate 
= dateStr.split(";");
        Date[][] startDateAndEndDate 
= new Date[seDate.length][2];

        
for (int i = 0; i < seDate.length; i++{
            String[] tempDate 
= seDate[i].split(",");
            startDateAndEndDate[i][
0= DateTimeUtil.getFormatDate(tempDate[0]);
            startDateAndEndDate[i][
1= DateTimeUtil.getFormatDate(tempDate[1]);
        }


        
return maxContinuousDays(startDateAndEndDate);

    }



    
/**
     * 判断时间段1和时间段2是否有交集
     * 
@param begintimeOne
     * 
@param endtimeOne
     * 
@param begintimeTwo
     * 
@param endtimeTwo
     * 
@return true:有交集,false:没有交集
     
*/

    
public static boolean isConfilct(String begintimeOne, String endtimeOne, String begintimeTwo,
            String endtimeTwo) 
{
        Date beginOne 
= getFormatDate(begintimeOne);
        Date endOne 
= getFormatDate(endtimeOne);
        Date beginTwo 
= getFormatDate(begintimeTwo);
        Date endTwo 
= getFormatDate(endtimeTwo);
        
if ((beginOne.compareTo(beginTwo) <= 0 && endOne.compareTo(beginTwo) >= 0)
                
|| (beginOne.compareTo(endTwo) <= 0 && endOne.compareTo(endTwo) >= 0)
                
|| (beginTwo.compareTo(beginOne) <= 0 && endTwo.compareTo(beginOne) >= 0)
                
|| (beginTwo.compareTo(endOne) <= 0 && endTwo.compareTo(endOne) >= 0)) {
            
return true;
        }

        
return false;
    }


    
/**
     * 取得最早可购买时间
     * 
@param busytimes 被购买时间,格式为2008-08-06,2008-08-06;2008-08-9,2008-08-12;2008-08-14,2008-08-22;2008-09-04,2008-09-04
     * 
@param days 购买时长
     * 
@return 最高可购买时间
     
*/

    
public static String getCansellTime(String busytimes, int days) {
        Map
<String, Integer> dayMap = new HashMap<String, Integer>();
        String[] busytimeArr 
= StringUtils.split(busytimes, ";");
        
for (int i = 0; i < busytimeArr.length; i++{
            String[] time 
= StringUtils.split(busytimeArr[i], ",");
            Date d1 
= getFormatDateTime(time[0], DATE_FORMAT);
            Date d2 
= getFormatDateTime(time[1], DATE_FORMAT);
            
while (d1.compareTo(d2) <= 0{
                dayMap.put(getFormatDate(d1), 
null);
                d1 
= getDateBeforeOrAfter(d1, 1);
            }

        }


        Date lastDate 
= getFormatDateTime(getFormatDate(getDateBeforeOrAfter(29)), DATE_FORMAT);
        Date beginDate 
= getFormatDateTime(getFormatDate(getDateBeforeOrAfter(2)), DATE_FORMAT);
        Date endDate 
= getDateBeforeOrAfter(beginDate, days - 1);

        
while (beginDate.compareTo(lastDate) <= 0{
            
boolean conflict = false;
            List
<Date> daysList = getDaysListBetweenDates(beginDate, endDate);
            
for (Date d : daysList) {
                
if (dayMap.containsKey(getFormatDate(d))) {
                    conflict 
= true;
                    
break;
                }

            }

            
if(!conflict){
                
break;
            }

            beginDate 
= getDateBeforeOrAfter(beginDate, 1);
            endDate 
= getDateBeforeOrAfter(beginDate, days - 1);
        }

        
return getFormatDate(beginDate);
    }



    
public static void main(String[] args) {
//        System.out
//                .print(maxContinuousDays("2008-08-06,2008-08-06;2008-08-06,2008-08-12;2008-09-04,2008-09-04"));
        System.out.println(getCansellTime("",7));
    }

}


只有注册用户登录后才能发表评论。


网站导航: