|
Posted on 2011-08-02 22:31 云云 阅读(12842) 评论(0) 编辑 收藏
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));
}
}

|