/**
* Copyright 1996-2013 Founder International Co.,Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author kenshin
*/
package org.foxbpm.web.common.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.foxbpm.engine.impl.util.StringUtil;
import org.foxbpm.web.common.exception.FoxbpmWebException;
/**
* 时间操作Util类
*/
public class DateUtil {
private final static SimpleDateFormat dfYyyy = new SimpleDateFormat("yyyy");
private final static SimpleDateFormat dfMM = new SimpleDateFormat("MM");
private final static SimpleDateFormat dfDd = new SimpleDateFormat("dd");
private final static SimpleDateFormat dfMmmYyyy = new SimpleDateFormat("MMM yyyy");
private final static SimpleDateFormat dfDdMMMYYYY = new SimpleDateFormat("dd MMM yyyy");
private final static SimpleDateFormat dfMmDdYYYY = new SimpleDateFormat("MM/dd/yyyy");
private final static SimpleDateFormat dfyyyyMMddHHMM = new SimpleDateFormat("yyyy-MM-dd HH:mm");
private final static SimpleDateFormat dfyyyyMMddHHMMSS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private final static SimpleDateFormat yyyyMmDd = new SimpleDateFormat("yyyy-MM-dd");
private final static SimpleDateFormat hhmm = new SimpleDateFormat("HH:mm"); // 24
// Hours
private final static SimpleDateFormat yyyymmdd = new SimpleDateFormat("yyyyMMdd");
private final static SimpleDateFormat yyyymm = new SimpleDateFormat("yyyyMM");
private final static SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss");
private final static SimpleDateFormat yyyyMMddHmmss = new SimpleDateFormat("yyyyMMddHmmss");
private final static SimpleDateFormat yyyyMMddmmss = new SimpleDateFormat("yyyyMMddmmss");
private final static String twentyFourHourRegExp = "^(([0-1][0-9])|(2[0-3])):([0-5][0-9])$";
private final static SimpleDateFormat dfyyyyMMddHHMMSSSSS = new SimpleDateFormat("yyyyMMddHHmmssSSS");
@SuppressWarnings("unused")
private final static String timeFormat = "^(\\d{1,4})(-|\\/)(\\d{1,2})(-|\\/)(\\d{1,2})$";
@SuppressWarnings("unused")
private static boolean compare(String one, String sybmol, String two) throws ParseException {
boolean result = false;
Date date1 = yyyyMmDd.parse(one);
Date date2 = yyyyMmDd.parse(two);
if (">".equals(sybmol)) {
result = date1.compareTo(date2) > 0;
} else if ("<".equals(sybmol)) {
result = date1.compareTo(date2) < 0;
} else if ("=".equals(sybmol) || "==".equals(sybmol)) {
result = date1.compareTo(date2) == 0;
} else if (">=".equals(sybmol)) {
result = date1.compareTo(date2) >= 0;
} else if ("<=".equals(sybmol)) {
result = date1.compareTo(date2) <= 0;
}
return result;
}
/**
* add by jinxinzhang
*
* @param pattern
* @return
*/
private static SimpleDateFormat getDateParser(String pattern) {
return new SimpleDateFormat(pattern);
}
public static String parseGMTTime(Long time, String format) {
Date date = new Date();
date.setTime(time);
SimpleDateFormat dformat = getDateParser(format);
return dformat.format(date);
}
/**
* 当前时间格式化(yyyyMMddHHmmssSSS)
*
* @return 时间
*/
public static String curDateTimeStr23() {
Date date = new Date();
// return getDateParser("yyyy-MM-dd HH:mm:ss:SSS").format(date);
return dfyyyyMMddHHMMSSSSS.format(date);
}
/**
* 当前时间格式化(yyyy-MM-dd HH:mm:ss)
*
* @return 时间
*/
public static String curDateTimeStr19() {
Date date = new Date();
// return getDateParser("yyyy-MM-dd HH:mm:ss").format(date);
return dfyyyyMMddHHMMSS.format(date);
}
/**
* 当前时间格式化(yyyy-MM-dd HH:mm:ss)
*
* @return 时间
*/
public static String curDateTimeYYYYMMDDHHMMSS() {
Date date = new Date();
// return getDateParser("yyyy-MM-dd HH:mm:ss").format(date);
return yyyyMMddHHmmss.format(date);
}
/**
* 获得日期对象(yyyy-MM-dd HH:mm:ss)
*
* @param dateTimeStr19
* @return 日期
*/
public static Date putTimeStr19ToDate(String dateTimeStr19) {
// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = dfyyyyMMddHHMMSS.parse(dateTimeStr19);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
/**
* 获得日期对象
*
* @param dateTimeStr
* @return 日期
*/
public static Date putTimeStr14ToDate(String dateTimeStr) {
// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
switch (dateTimeStr.length()) {
case 12:
date = yyyyMMddmmss.parse(dateTimeStr);
break;
case 13:
;
date = yyyyMMddHmmss.parse(dateTimeStr);
break;
case 14:
;
date = yyyyMMddHHmmss.parse(dateTimeStr);
break;
default:
break;
}
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
/**
* 格式化指定日期(yyyy-MM-dd HH:mm)
*
* @param date
* @return
*/
public static String putDateToTimeStr16(Date date) {
return dfyyyyMMddHHMM.format(date);
}
/**
* 格式化指定日期(yyyy-MM-dd HH:mm:ss)
*
* @param date
* @return 日期
*/
public static String putDateToTimeStr19(Date date) {
// return getDateParser("yyyy-MM-dd HH:mm:ss").format(date);
return dfyyyyMMddHHMMSS.format(date);
}
/**
* 格式化指定日期(HH:mm)
*
* @param date
* @return 日期
*/
public static String putDateToTimeHhMm(Date date) {
return hhmm.format(date);
}
/**
* 格式化指定日期(yyyy-MM-dd)
*
* @param date
* @return 日期
*/
public static String putDateToTimeStr10(Date date) {
// return getDateParser("yyyy-MM-dd").format(date);
return yyyyMmDd.format(date);
}
/**
* 格式化指定日期(yyyyMM)
*
* @param date
* @return 日期
*/
public static String putDateToYmStr(Date date) {
String dateStr = null;
if (date != null)
dateStr = yyyymm.format(date);
return dateStr;
}
/**
* 格式化指定日期(yyyyMMdd)
*
* @param date
* @return 日期
*/
public static String putDateToYmdStr(Date date) {
String dateStr = null;
if (date != null)
dateStr = yyyymmdd.format(date);
return dateStr;
}
/**
* 获得当前时间
*
* @return 时间
*/
public static Date currentDate() {
return new Date();
}
/**
* 获得当前日期的年份
*
* @return 年份
*/
public static Integer currentYear() {
return Integer.valueOf(dfYyyy.format(currentDate()));
}
/**
* @param topupSeq
* @return 年
*/
public static Integer currentTopupYear(String topupSeq) {
if ("3".equals(topupSeq) || "4".equals(topupSeq))
return currentYear() - 1;
else
return currentYear();
}
/**
* 获得当前日期的月份
*
* @return 月份
*/
public static Integer currentMonth() {
return Integer.valueOf(dfMM.format(currentDate()));
}
/**
* 获得当前日期的天
*
* @return 天
*/
public static Integer currentNumDate() {
return Integer.valueOf(dfDd.format(currentDate()));
}
/**
* 获得当前日期的上月的日期
*
* @return 日期
*/
public static Date preMonthDate() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
return cal.getTime();
}
/**
* 获得当前日期的上月的日期(MMM yyyy)
*
* @return 日期
*/
public static String preMonth() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
return String.valueOf(dfMmmYyyy.format(cal.getTime()));
}
/**
* 获得当前日期的上月首日日期(dd MMM yyyy)
*
* @return 日期
*/
public static String firstDayOfLastMonth() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
cal.set(Calendar.DATE, 1);
return String.valueOf(dfDdMMMYYYY.format(cal.getTime()));
}
/**
* 获得当前日期的上月末日日期(dd MMM yyyy)
*
* @return 日期
*/
public static String lastDayOfLastMonth() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
cal.add(Calendar.DATE, -1);
return String.valueOf(dfDdMMMYYYY.format(cal.getTime()));
}
/**
* 获得当前日期(dd MMM yyyy)
*
* @return 日期
*/
public static String letterDate() {
return String.valueOf(dfDdMMMYYYY.format(currentDate()));
}
/**
* 获得指定日期(dd MMM yyyy)
*
* @param dt
* @return 日期
*/
public static String letterDate(Date dt) {
if (dt != null)
return String.valueOf(dfDdMMMYYYY.format(dt));
else
return "";
}
/**
* 获得指定日期(dd MMM yyyy)的日期类
*
* @param ddMmmYyyy
* @return 日期
*/
public static Date getDateDdMmmYyyy(String ddMmmYyyy) {
try {
return dfDdMMMYYYY.parse(ddMmmYyyy);
} catch (ParseException e) {
return null;
}
}
/**
* 获得指定的日期(MMM yyyy)
*
* @param dt
* @return 日期
*/
public static String dateMmmYyyy(Date dt) {
if (dt != null)
return String.valueOf(dfMmmYyyy.format(dt));
else
return "";
}
/**
* 获得指定的日期(yyyy-MM-dd)
*
* @param dt
* @return 日期
*/
public static String dateYyyyMmDd(Date dt) {
if (dt != null)
return String.valueOf(yyyyMmDd.format(dt));
else
return "";
}
/**
* 获得指定的日期(yyyy-MM-dd HH:mm:ss)
*
* @param dt
* @return 日期
*/
public static String dateYyyyMmDdHhMmSs(Date dt) {
if (dt != null)
return String.valueOf(dfyyyyMMddHHMMSS.format(dt));
else
return "";
}
/**
* 获得指定的日期(MM/dd/yyyy)
*
* @param dt
* @return 日期
*/
public static String dateMmDdYyyy(Date dt) {
if (dt != null)
return String.valueOf(dfMmDdYYYY.format(dt));
else
return "";
}
// Maybe need to change the algorithm, depends on the requirment
/**
* 根据指定的日期计算年龄
*
* @param dob
* @return 年龄
*/
public static int age(Date dob) {
Calendar from = Calendar.getInstance();
Calendar to = Calendar.getInstance();
from.setTime(dob);
to.setTime(new Date());
int birthYYYY = from.get(Calendar.YEAR);
int curYYYY = to.get(Calendar.YEAR);
int ageInYears = curYYYY - birthYYYY;
if (ageInYears < 0)
ageInYears = 0;
return ageInYears;
}
/**
* 计算2个日期相距的天数
*
* @param beginDate
* 开始日期
* @param endDate
* 结束日期
* @return 天数
*/
public static int dayBetweenTwoDates(Date beginDate, Date endDate) {
int days;
int pnMark = 1;
if (endDate != null && beginDate != null) {
Calendar bCalendar = Calendar.getInstance();
Calendar eCalendar = Calendar.getInstance();
if (beginDate.after(endDate)) {
pnMark = -1;
bCalendar.setTime(endDate);
eCalendar.setTime(beginDate);
} else {
bCalendar.setTime(beginDate);
eCalendar.setTime(endDate);
}
int dayBegin = bCalendar.get(Calendar.DAY_OF_YEAR);
int dayEnd = eCalendar.get(Calendar.DAY_OF_YEAR);
days = dayEnd - dayBegin;
int endYear = eCalendar.get(Calendar.YEAR);
if (bCalendar.get(Calendar.YEAR) != endYear) {
bCalendar = (Calendar) bCalendar.clone();
}
while (bCalendar.get(Calendar.YEAR) != endYear) {
days += bCalendar.getActualMaximum(Calendar.DAY_OF_YEAR);
bCalendar.add(Calendar.YEAR, 1);
}
} else
days = 0;
return days * pnMark;
}
/**
* 计算2个日期相距的时间差(差的形式为:XX天XX小时XX分XX秒)
*
* @param beginDate
* 开始日期
* @param endDate
* 结束日期
* @return XX天XX小时XX分XX秒
*/
public static String timeBetweenTwoDates(Date beginDate, Date endDate) {
// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// java.util.Date now = df.parse("2004-03-26 13:31:40");
// java.util.Date date=df.parse("2004-01-02 11:30:24");
long l = endDate.getTime() - beginDate.getTime();
long day = l / (24 * 60 * 60 * 1000);
long hour = (l / (60 * 60 * 1000) - day * 24);
long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60);
long s = (l / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
return day + "天" + hour + "小时" + min + "分" + s + "秒";
}
/**
* 获得指定日期相距指定天数的日期
*
* @param dt
* 指定日期
* @param n
* 天数
* @return 日期
*/
public static Date dateAfterNDays(Date dt, int n) {
Calendar cal = Calendar.getInstance();
cal.setTime(dt);
cal.add(Calendar.DATE, n);
return cal.getTime();
}
/**
* 获得指定日期相距指定月数的日期
*
* @param dt
* 指定日期
* @param n
* 月数
* @return 日期
*/
public static Date dateAfterNMonths(Date dt, int n) {
Calendar cal = Calendar.getInstance();
cal.setTime(dt);
cal.add(Calendar.MONTH, n);
return cal.getTime();
}
/**
* 获得指定日期相距指定天数的日期
*
* @param dt
* 指定日期
* @param n
* 年数
* @return 日期
*/
public static Date dateAfterNYears(Date dt, int n) {
Calendar cal = Calendar.getInstance();
cal.setTime(dt);
cal.add(Calendar.YEAR, n);
return cal.getTime();
}
// public static void main(String[] args){
// System.out.println(getDateDdMmmYyyy("12 Dec 2007"));
// System.out.println(dateYyyyMmDdHhMmSs(new Date()));
// System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new
// Date()));
// try {
// Date d1=yyyyMmDd.parse("2004-07-09");
// Date d2=yyyyMmDd.parse("2007-07-01");
// System.out.println(dayBetweenTwoDates(d1,d2));
// Calendar bCalendar = Calendar.getInstance();
// bCalendar.setTime(d1);
// System.out.println(bCalendar.getActualMaximum(Calendar.DAY_OF_YEAR));
// } catch (ParseException e) {
// e.printStackTrace();
// }
// }
/**
* 对当前日期使用指定格式格式化
*
* @param formart
* 指定格式
* @return 日期
*/
public static String getDateFormatStr(String formart) {
return new SimpleDateFormat(formart).format(new java.util.Date());
}
/**
* 计算2个日期相距的天数
*
* @param startDay
* 起始日期
* @param endDay
* 结束日期
* @return 天数
*/
public static int getIntervalDays(Date startDay, Date endDay) {
if (startDay.after(endDay)) {
Date cal = startDay;
startDay = endDay;
endDay = cal;
}
long startl = startDay.getTime();
long endl = endDay.getTime();
long ei = endl - startl;
return (int) (ei / (1000 * 60 * 60 * 24));
}
/**
* 获得当前的日期(yyyy-MM-dd)
*
* @return 日期
*/
public static String getCurrentDateStr() {
Date now = new Date();
// SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
// return df.format(now);
return yyyyMmDd.format(now);
}
/**
* 获得当前日期之后指定天数的日期(yyyy-MM-dd)
*
* @param days
* 指定天数
* @return 日期
*/
public static String getBookInfoDate(int days) {
Date now = new Date();
// SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
// return df.format(new Date(now.getTime() - (long)days * 24 * 60 * 60 *
// 1000));
return yyyyMmDd.format(new Date(now.getTime() - (long) days * 24 * 60 * 60 * 1000));
}
/**
* check if the string is one valid time, it should be hh:mm
*
* @param timeStr
* @return 结果
*/
public static boolean isValidTimeHHMM(String timeStr) {
if (StringUtil.isNotEmpty(timeStr)) {
Pattern p = Pattern.compile(twentyFourHourRegExp);
Matcher m = p.matcher(timeStr);
return m.matches();
} else
return false;
}
/**
* get format string Current Year
*
* @return 日期
*/
public static String getFormatCurYearAsYYYY() {
return dfYyyy.format(currentDate());
}
/**
* get format string Previous Year
*
* @return 日期
*/
public static String getFormatPreYearAsYYYY() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);
return dfYyyy.format(cal.getTime());
}
/**
* get format string current month "YYYYMM"
*
* @return 日期
*/
public static String getFormatCurMonthAsYYYYMM() {
return yyyymm.format(currentDate());
}
/**
* get format string previous month "YYYYMM"
*
* @return 日期
*/
public static String getFormatPreMonthAsYYYYMM() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
return yyyymm.format(cal.getTime());
}
/**
* 获得指定年月的最后一天
*
* @param year
* 指定年份
* @param month
* 指定月份
* @return 天
*/
public static int getLastDayOfMonth(int year, int month) {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
return 31;
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
}
if (month == 2) {
if (isLeapYear(year)) {
return 29;
} else {
return 28;
}
}
return 0;
}
/**
* 判断指定年份是否是闰年
*
* @param year
* 指定年份
* @return true:是闰年 false:不是闰年
*/
public static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
/**
* 获得指定日期所在季度的起始月份或结束月份
*
* @param date
* 指定日期
* @param firstOrLast
* true:起始月份 false:结束月份
* @return 日期
*/
public static String getMonthOfSeason(Date date, boolean firstOrLast) {
SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
SimpleDateFormat monthFormat = new SimpleDateFormat("MM");
String yearStr = yearFormat.format(date);
String monthStr = monthFormat.format(date);
int month = Integer.parseInt(monthStr);
String array[][] = { { "01", "02", "03" }, { "04", "05", "06" }, { "07", "08", "09" }, { "10", "11", "12" } };
int season = 1;
if (month >= 1 && month <= 3) {
season = 1;
}
if (month >= 4 && month <= 6) {
season = 2;
}
if (month >= 7 && month <= 9) {
season = 3;
}
if (month >= 10 && month <= 12) {
season = 4;
}
String start_month = array[season - 1][0];
String end_month = array[season - 1][2];
if (firstOrLast) {
return yearStr + start_month;
} else {
return yearStr + end_month;
}
}
/**
* 将字符串转换成时间
*
* @param dateString
* 字符串时间
* @param formatString
* 转换格式
* @return
*/
public static Date stringToDate(String dateString, String formatString) {
SimpleDateFormat sdf = new SimpleDateFormat(formatString);
Date date = null;
try {
date = sdf.parse(StringUtil.getString(dateString));
} catch (ParseException e) {
throw new FoxbpmWebException("日期 " + dateString + " 格式转换出错!", e.getMessage());
}
return date;
}
/**
* 将字符串转换成时间
*
* @param dateString
* 字符串时间
* @param sdf
* 转换格式对象 不能为空
* @return
*/
public static Date stringToyyyyMmDdDate(String dateString) {
Date date = null;
try {
date = yyyyMmDd.parse(StringUtil.getString(dateString));
} catch (ParseException e) {
throw new FoxbpmWebException("日期 " + dateString + " 格式转换出错!", e.getMessage());
}
return date;
}
}