package com.minpay.common.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.bind.ValidationException;
/**
* @ClassName: DateUtil
* @Description: 日期时间处理类
* @author Michael
* @date 2012-2-1 上午10:09:36
* @version 1.0
*/
public class DateUtil {
public static final String DEFAULT_TIME_FORMAT_DB = "yyyyMMddHHmmss";
/**
* @Title: getCurrentDateString
* @Description: 得到当前日期字符串:yyyymmdd
* @return String:yyyyMMdd
* @throws
*/
public static String getCurrentDateString() {
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH) + 1;
int date = calendar.get(Calendar.DATE);
return "" + calendar.get(Calendar.YEAR)
+ (month < 10 ? "0" + month : "" + month)
+ (date < 10 ? "0" + date : "" + date);
}
/**
* @Title: getCurrentDateTimeString
* @Description: 得到当前日期字符串:yyyyMMddHHmmss
* @return String:yyyyMMddHHmmss
* @throws
*/
public static String getCurrentDateTimeString() {
return getDifferentTime(0);
}
/**
* 获取制定格式的日期
*
* @param format yyyyMMddHHmmss
* yyyy
* ddHHmm
*
* @return String
*/
public static String getDifferentTimeByFormat( String format )
{
GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat( format );
return formatter.format( calendar.getTime() );
}
/**
* @Title: getCurrentDate
* @Description: 得到当前日期字符串,适用于数据库为Date类型,yyyyMMddHHmmss
* @return Date:yyyyMMddHHmmss
* @throws
*/
public static java.util.Date getCurrentDate() {
return new java.util.Date();
}
// 判断两日期格式是否相等
public static boolean isDateEqual(java.util.Date date1, java.util.Date date2) {
java.util.Calendar cal1 = java.util.Calendar.getInstance();
cal1.setTime(date1);
java.util.Calendar cal2 = java.util.Calendar.getInstance();
cal2.setTime(date2);
return (cal1.get(java.util.Calendar.YEAR) == cal2
.get(java.util.Calendar.YEAR)
&& cal1.get(java.util.Calendar.MONTH) == cal2
.get(java.util.Calendar.MONTH) && cal1
.get(java.util.Calendar.DAY_OF_MONTH) == cal2
.get(java.util.Calendar.DAY_OF_MONTH));
}
// 将格式为“20060302”形式的字符串转换成日期类型yyyy-MM-dd
public static java.util.Date getToDate(String s) {
StringBuffer sb = new StringBuffer();
sb.append(s.substring(0, 4)).append("-").append(s.substring(4, 6))
.append("-").append(s.substring(6, 8));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date obj = null;
try {
obj = sdf.parse(sb.toString());
} catch (ParseException e) {
//自动生成 catch 块
e.printStackTrace();
System.err.println("change date type error");
}
return obj;
}
// 将格式为“2006-02-23”的日期字符串转化为日期类型
/**
* 将格式为“2006-02-23”的日期字符串转化为日期类型 格式为"2004-10-10" --> Date
*
* checkStartEndDate
*
*
* @param context
* @throws ValidationException
* @author Songyi 2004-12-15
* @since 1.1
*/
public static java.util.Date getString2Date(String sDate) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date obj = null;
try {
obj = sdf.parse(sDate);
} catch (ParseException e) {
e.printStackTrace();
System.err.println("change date type error");
}
return obj;
}
// 判断当前的字符串是否为当前日期
public static boolean isCurrentDate(String strDate) {
return strDate == null || !strDate.equals(getCurrentDateString()) ? false
: true;
}
// 取当前日期前一天或后一天,up传true表示取当前的前一天,up传false表示取当前日期的后一天
public static String rollDate(java.util.Date date, boolean up) {
if (date == null)
return null;
GregorianCalendar beforeCalendar = new GregorianCalendar();
beforeCalendar.setTime(date);
beforeCalendar.add(Calendar.DATE, up ? +1 : -1);
int beforeDate = beforeCalendar.get(Calendar.DATE);
int beforeMonth = beforeCalendar.get(Calendar.MONTH) + 1;
int beforeYear = beforeCalendar.get(Calendar.YEAR);
return "" + beforeYear
+ (beforeMonth < 10 ? "0" + beforeMonth : "" + beforeMonth)
+ (beforeDate < 10 ? "0" + beforeDate : "" + beforeDate);
}
// 返回年月日方式或者年月日时分方式对应的日期时间
/**
* @param str
* @return
*/
public static Date String2Date(String str) {
try {
SimpleDateFormat s1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat s2 = new SimpleDateFormat("yyyyMMddHHmm");
SimpleDateFormat s3 = new SimpleDateFormat("yyyyMMddHHmmss");
if (str.length() == 8) {
return s1.parse(str);
} else if (str.length() == 12) {
return s2.parse(str);
} else if (str.length() == 14) {
return s3.parse(str);
} else {
throw new RuntimeException("validation.date.parse_error");
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("adsasd");
}
}
// 比较2个日期:返回-1,1,0
/**
* @param StartDate
* @param EndDate
* @return
*/
public static int DateCompare(String StartDate, String EndDate) {
Date start = String2Date(StartDate);
Date end = String2Date(EndDate);
if (start.before(end)) {
return -1;
} else if (start.after(end)) {
return 1;
} else
return 0;
}
// 比较2个时间:返回-1,1,0
/**
* @param StartTime
* @param EndTime
* @return
*/
public static int TimeCompare(String StartTime, String EndTime) {
if ((StartTime.length() != 4) || (EndTime.length() != 4)) {
throw new RuntimeException("validation.time.parse_error");
}
int startHour = Integer.parseInt(StartTime.substring(0, 2));
int startMin = Integer.parseInt(StartTime.substring(2, 4));
int endHour = Integer.parseInt(EndTime.substring(0, 2));
int endMin = Integer.parseInt(EndTime.substring(2, 4));
if (startHour < endHour) {
return -1;
} else if (startHour > endHour) {
return 1;
} else {
if (startMin < endMin) {
return -1;
} else if (startMin > endMin) {
return 1;
} else
return 0;
}
}
// 获得从now开始iMonth个月前的一天
/**
* @param now
* @param iMonth
* @return
*/
public static Date getDateBefore(Date now, int iMonth) {
Calendar c = Calendar.getInstance();
c.setTime(now);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
month = month - iMonth;
if (month < 1) {
month = month + 12;
year = year - 1;
}
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
return c.getTime();
}
// 获得从now开始iMonth个月后的一天
/**
* @param now
* @param iMonth
* @return
*/
public static Date getDateAfter(Date now, int iMonth) {
Calendar c = Calendar.getInstance();
c.setTime(now);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
month = month + iMonth;
if (month > 12) {
month = month - 12;
year = year + 1;
}
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
return c.getTime();
}
public static Date getLastDay(Date now) {
Calendar c = Calendar.getInstance();
c.setTime(now);
int day = c.get(Calendar.DAY_OF_MONTH);
c.set(Calendar.DAY_OF_MONTH, day - 1);
return c.getTime();
}
// 得到当前日期的开始时间
/**
* 得到当前日期的开始时间
*
* @param now
* @return
*/
public static Date getDayStart(Date now) {
Calendar c = Calendar.getInstance();
c.setTime(now);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
return c.getTime();
}
// 得到当前日期的结束时间
/**
* 得到当前日期的结束时间
*
* @param now
* @return
*/
public static Date getDayEnd(Date now) {
Calendar c = Calendar.getInstance();
c.setTime(now);
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
return c.getTime();
}
/**
* 得到当前日期的前一个月的第一天/最后一天
* @param now
* @return
*/
public static String getBeforeMonth(boolean bool) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Calendar cale = Calendar.getInstance();
String backTime = null;
if(bool){
// 获取前月的第一天
cale.add(Calendar.MONTH, -1);
cale.set(Calendar.DAY_OF_MONTH, 1);
backTime = format.format(cale.getTime())+"000000";
}else{
// 获取前月的最后一天
cale.add(Calendar.MONTH, 0);
cale.set(Calendar.DAY_OF_MONTH, 0);
backTime = format.format(cale.getTime())+"235959";
}
return backTime;
}
// 判断输入的日期是否符合要求,1、3、5、7、8、10、12月日期不能大于31日,4、6、9、11月不能日期不能大于30日,2月平年不能大于28日,润年不能大于29日
public static boolean isDateValid(String inStr) {
int year, month, day;
year = Integer.parseInt(inStr.substring(0, 4));
if (inStr.indexOf(4) == '0') {
month = Integer.parseInt(inStr.substring(5, 6));
} else {
month = Integer.parseInt(inStr.substring(4, 6));
}
if (inStr.indexOf(6) == '0') {
day = Integer.parseInt(inStr.substring(7, 8));
} else {
day = Integer.parseInt(inStr.substring(6, 8));
}
if (month > 12 || day > 31 || month < 1 || day < 1)
return false;
if (month == 4 || month == 6 || month == 9 || month == 11) {
if (day > 30)
return false;
}
if (month == 2) {
if (year % 4 == 0) {
if (day > 29)
return false;
} else {
if (day > 28)
return false;
}
}
return true;
}
/**
* 取得指定时间间隔后的系统时间
*
* @param hour
* 小时
* @return String
*/
public static String getDifferentTime( int hour )
{
GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
calendar.add( Calendar.HOUR, hour );
SimpleDateFormat formatter = new SimpleDateFormat( DEFAULT_TIME_FORMAT_DB );
return formatter.format( calendar.getTime() );
}
/**
* 取得指定时间间隔后的系统时间
*
* @param minutes
*
* @return String
*/
public static String getDifferentTimeByMinute( int minutes )
{
GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
calendar.add( Calendar.MINUTE, minutes);
SimpleDateFormat formatter = new SimpleDateFormat( DEFAULT_TIME_FORMAT_DB );
return formatter.format( calendar.getTime() );
}
public static String getDifferentTimeByMinute(String date1, int minutes,
String format) {
Calendar cal1 = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat(format);
try {
cal1.setTime(formatter.parse(date1));
cal1.add(Calendar.MINUTE, minutes);
} catch (ParseException e) {
e.printStackTrace();
}
return formatter.format(cal1.getTime());
}
/**
* 取得若干天前/后的系统日期
*
* @param days
* 与现在相隔的日数,正数为当前日期之后,负数为当前日期之前
* @return String
*/
public static String getDifferentDate(int days) {
return getDifferentTime(24 * days);
}
/**
* 比较日期时间
*
*
*/
public static int dateTimeCompare(String date1,String date2) {
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat( DEFAULT_TIME_FORMAT_DB );
try {
cal1.setTime(formatter.parse(date1));
cal2.setTime(formatter.parse(date2));
} catch (ParseException e) {
e.printStackTrace();
}
int result=cal1.compareTo(cal2);
return result;
}
/**
* 根据指定格式比较时间
*
*
*/
public static int dateTimeCompare(String date1, String date2, String format) {
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat(
format);
try {
cal1.setTime(formatter.parse(date1));
cal2.setTime(formatter.parse(date2));
} catch (ParseException e) {
e.printStackTrace();
}
int result = cal1.compareTo(cal2);
return result;
}
// 主函数
/**
* @param args
*/
public static void main(String[] args) {
// 公共函数测试
String enddate="20170112150922";
System.out.println(enddate.substring(6, 14));
// Date date1 = new Date();
// Date date2 = new Date();
// System.out.println("date1=" + date1 + " date2=" + date2);
// System.out.println("isDateEqual(date1,date2)="
// + isDateEqual(date1, date2));
// System.out.println(dateTimeCompare("20131009090910","20131009090909"));
// System.out.println(dateTimeCompare("20131109090909","20131009090909"));
// System.out.println("getCurrentDateString()=" + getCurrentDateString());
//
// System.out.println("rollDate()=" + rollDate(new Date(), false));
//
// String StartDate = "20060489";
// String EndDate = "20060403";
// Date start = String2Date(StartDate);
// Date end = String2Date(EndDate);
//
// System.out.println("start=" + start + " end=" + end);
//
// // 查询截止时间应在当天前的测试
// Date now = new Date(System.currentTimeMillis());
// String yestodayStr = rollDate(now, false);
// System.out.println(yestodayStr);
// Date yestoday = String2Date(yestodayStr);
// System.out.println(yestoday);
//
// System.out.println("start=" + start + ";end=" + end + "now="
// + getDayStart(now));
// if (start.after(getDayStart(now)) || isDateEqual(start, now))
// System.out.println("a");
// if ((!start.before(now)) || (!end.before(now))
// || (isDateEqual(start, now)) || (isDateEqual(end, now))) {
// System.out.println("adsadfa");
// }
//
// // 字符串匹配的测试
// Pattern p = Pattern
// .compile("([1-9]{1}[0-9]{3})(([0]{1}[1-9]{1})|([1]{1}[0-2]{1}))(([0]{1}[1-9]{1})|([1-2]{1}[0-9]{1})|([3]{1}[0-1]{1}))");
// Matcher m = p.matcher("19990131");
// boolean b = m.matches();
// System.out.println(b);
//
// String bankSeqAndinputCode = "|adsfadsfa";
// System.out.println(bankSeqAndinputCode.indexOf('|'));
// String bankSeq = bankSeqAndinputCode.substring(0,
// bankSeqAndinputCode.indexOf('|'));
// String inputCode = bankSeqAndinputCode.substring(
// bankSeqAndinputCode.indexOf('|') + 1,
// bankSeqAndinputCode.length());
// System.out.println("bankSeq=" + bankSeq + " inputCode=" + inputCode);
//
// Map map = new HashMap();
// map.put("name", "ldl");
// map.put("sex", "mail");
// map.put("age", "26");
//
// // method1
// Iterator keyValuePairs1 = map.entrySet().iterator();
// for (int i = 0; i < map.size(); i++) {
// Map.Entry entry = (Map.Entry) keyValuePairs1.next();
// Object key = entry.getKey();
// Object value = entry.getValue();
// System.out.println("key[" + i + "]=" + key + " value[" + i + "]="
// + value);
// }
// System.out.println();
//
// // method2
// Object[] keyValuePairs2 = map.entrySet().toArray();
// for (int i = 0; i < map.size(); i++) {
// Map.Entry entry = (Map.Entry) keyValuePairs2[i];
// Object key = entry.getKey();
// Object value = entry.getValue();
// System.out.println("key[" + i + "]=" + key + " value[" + i + "]="
// + value);
// }
// System.out.println();
//
// // method3
// Iterator keyValuePairs3 = map.entrySet().iterator();
// int i = 0;
// while (keyValuePairs3.hasNext()) {
// i++;
// Map.Entry entry = (Map.Entry) keyValuePairs3.next();
// Object key = entry.getKey();
// Object value = entry.getValue();
// System.out.println("key[" + i + "]=" + key + " value[" + i + "]="
// + value);
// }
// System.out.println();
//
// // method4:error
// Iterator keyValuePairs4 = map.entrySet().iterator();
// for (Map.Entry entry = (Map.Entry) keyValuePairs4.next(); keyValuePairs4
// .hasNext(); entry = (Map.Entry) keyValuePairs4.next()) {
// Object key = entry.getKey();
// Object value = entry.getValue();
// System.out.println("key[" + i + "]=" + key + " value[" + i + "]="
// + value);
// }
// System.out.println();
//
// // 日期格式判断的测试
// System.out.println(isDateValid("20040229"));
// Properties p1 = new Properties();
// p1.setProperty("1", "2");
// System.out.println(p1.toString());
}
/**
*
* @Title: parseDate
* @Description: 把字符串解析为日期
* @param dateStr
* @param format
* @return Date
*/
public static Date parseDate(String dateStr, String format) {
Date date = null;
try {
DateFormat df = new SimpleDateFormat(format);
date = (Date) df.parse(dateStr);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
/**
* @Title: format
* @Description: 把日期格式化输出为字符串
* @param date
* @param format
* @return String
*/
public static String format(Date date, String format) {
String result = "";
try {
if (date != null) {
DateFormat df = new SimpleDateFormat(format);
result = df.format(date);
}
} catch (Exception e) {
}
return result;
}
/**
*
* @Title: getMillis
* @Description: 返回当前毫秒
* @param date
* @return
*/
public static long getMillis(java.util.Date date) {
java.util.Calendar c = java.util.Calendar.getInstance();
c.setTime(date);
return c.getTimeInMillis();
}
/**
* @Title: diffDate
* @Description: 两个日期相差几天
* @param dateStart
* @param dateEnd
* @return
*/
public static int diffDate(java.util.Date dateStart, java.util.Date dateEnd) {
return (int) ((getMillis(dateStart) - getMillis(dateEnd)) / (24 * 3600 * 1000));
}
/**
* 昨天
* @param c
* @return
*/
public static Calendar yesterday(Calendar c){
long offset = 1*24*60*60*1000;
Calendar calendar = null;
if(c != null){
calendar = c;
}else{
calendar = Calendar.getInstance();
}
calendar.setTimeInMillis(calendar.getTimeInMillis() - offset);
return calendar;
}
/**
* 明天
* @param c
* @return
*/
public static Calendar tomorrow(Calendar c){
long offset = 1*24*60*60*1000;
Calendar calendar = null;
if(c != null){
calendar = c;
}else{
calendar = Calendar.getInstance();
}
calendar.setTimeInMillis(calendar.getTimeInMillis() + offset);
return calendar;
}
/**
* 微信接口使用,计算时间差
* @param startTime
* @param endTime
* @return
*/
public static Long dateDiff(String startTime,
String endTime) {
// 按照传入的格式生成一个simpledateformate对象
SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddHHmmss");
long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
long nh = 1000 * 60 * 60;// 一小时的毫秒数
long nm = 1000 * 60;// 一分钟的毫秒数
long diff;
long day = 0;
long hour = 0;
long min = 0;
// 获得两个时间的毫秒时间差异
try {
diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
day = diff / nd;// 计算差多少天
hour = diff % nd / nh + day * 24;// 计算差多少小时
min = diff % nd % nh / nm + hour * 60;// 计算差多少分钟
return min;
} catch (ParseException e) {
e.printStackTrace();
}
return min;
}
/**
* @Title: getBeforeDateTimeString
* @Description: 得到当前日期前N分钟时间字符串:yyyyMMddHHmmss
* @return String:yyyyMMddHHmmss
* @throws
*/
public static String getBeforeDateTimeString(int minute) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE, minute);
SimpleDateFormat formatter = new SimpleDateFormat( DEFAULT_TIME_FORMAT_DB );
return formatter.format( calendar.getTime() );
}
/**
* 指定日期加上天数后的日期
* @param num 为增加的天数
* @param newDate 创建时间
* @return
* @throws ParseException
*/
public static String plusDay(int num,String newDate) throws ParseException{
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Date currdate = format.parse(newDate);
//Calendar c = Calendar.getInstance();
System.out.println("当前日期:"+format.format(currdate.getTime()));
Calendar calendar = Calendar.getInstance();
calendar.setTime(currdate);
calendar.add(Calendar.DATE, num);
String enddate = format.format(calendar.getTime());
System.out.println("增加天数以后的日期:" + enddate);
return enddate;
}
/**
* 获取本月第一天
* @return
*/
public static String getmindate(){
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
return String.valueOf(calendar.getTime());
}
/**
* 获取本月最后一天
* @return
*/
public static String getmaxdate(){
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
calendar2.set(Calendar.DAY_OF_MONTH, calendar2.getActualMaximum(Calendar.DAY_OF_MONTH));
return String.valueOf(calendar2.getTime());
}
}