DateUtil.java package com.framework.utils;import java.math.BigDecimal;import java.sql.Timestamp;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;im
package com.framework.utils;
import java.math.BigDecimal;
import java.sql.Timestamp;
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 java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 日期工具类
*
* @author 谭长华
* @version 2015-12-08
*
*/
public class DateUtil {
// 默认显示日期的格式
public static final String DATAFORMAT_STR = "yyyy-MM-dd";
// 默认显示日期的格式
public static final String YYYY_MM_DATAFORMAT_STR = "yyyy-MM";
// 默认显示日期时间的格式
public static final String DATATIMEF_STR = "yyyy-MM-dd HH:mm:ss";
// 默认显示简体中文日期的格式
public static final String ZHCN_DATAFORMAT_STR = "yyyy年MM月dd日";
// 默认显示简体中文日期时间的格式
public static final String ZHCN_DATATIMEF_STR = "yyyy年MM月dd日HH时mm分ss秒";
// 默认显示简体中文日期时间的格式
public static final String ZHCN_DATATIMEF_STR_4yMMddHHmm = "yyyy年MM月dd日HH时mm分";
private static DateFormat dateFormat = null;
private static DateFormat dateTimeFormat = null;
private static DateFormat zhcnDateFormat = null;
private static DateFormat zhcnDateTimeFormat = null;
static {
dateFormat = new SimpleDateFormat(DATAFORMAT_STR);
dateTimeFormat = new SimpleDateFormat(DATATIMEF_STR);
zhcnDateFormat = new SimpleDateFormat(ZHCN_DATAFORMAT_STR);
zhcnDateTimeFormat = new SimpleDateFormat(ZHCN_DATATIMEF_STR);
}
/**
* 获得指定格式的时间
* @param formatStr 格式
* @return DateFormat
*/
private static DateFormat getDateFormat(String formatStr) {
if (formatStr.equalsIgnoreCase(DATAFORMAT_STR)) {
return dateFormat;
} else if (formatStr.equalsIgnoreCase(DATATIMEF_STR)) {
return dateTimeFormat;
} else if (formatStr.equalsIgnoreCase(ZHCN_DATAFORMAT_STR)) {
return zhcnDateFormat;
} else if (formatStr.equalsIgnoreCase(ZHCN_DATATIMEF_STR)) {
return zhcnDateTimeFormat;
} else {
return new SimpleDateFormat(formatStr);
}
}
/**
* 按照默认显示日期时间的格式"yyyy-MM-dd HH:mm:ss",转化dateTimeStr为Date类型
* dateTimeStr必须是"yyyy-MM-dd HH:mm:ss"的形式
*
* @param dateTimeStr
* yyyy-MM-dd HH:mm:ss
* @return Thu Dec 10 11:59:59 CST 2015
*/
public static Date getDate(String dateTimeStr) {
return getDate(dateTimeStr, DATATIMEF_STR);
}
/**
* 按照默认formatStr的格式,转化dateTimeStr为Date类型 dateTimeStr必须是formatStr的形式
*
* @param dateTimeStr
* @param formatStr
* @return
*/
public static Date getDate(String dateTimeStr, String formatStr) {
try {
if (dateTimeStr == null || dateTimeStr.equals("")) {
return null;
}
DateFormat sdf = getDateFormat(formatStr);
java.util.Date d = sdf.parse(dateTimeStr);
return d;
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 将YYYYMMDD转换成Date日期
*
* @param date
* @return
* @throws BusinessException
*/
public static Date transferDate(String date) throws Exception {
if (date == null || date.length() < 1)
return null;
if (date.length() != 8)
throw new Exception("日期格式错误");
String con = "-";
String yyyy = date.substring(0, 4);
String mm = date.substring(4, 6);
String dd = date.substring(6, 8);
int month = Integer.parseInt(mm);
int day = Integer.parseInt(dd);
if (month < 1 || month > 12 || day < 1 || day > 31)
throw new Exception("日期格式错误");
String str = yyyy + con + mm + con + dd;
return DateUtil.getDate(str, DateUtil.DATAFORMAT_STR);
}
/**
* 将Date转换成字符串“yyyy-mm-dd hh:mm:ss”的字符串
*
* @param date
* @return yyyy-mm-dd hh:mm:ss
*/
public static String dateToDateString(Date date) {
return dateToDateString(date, DATATIMEF_STR);
}
/**
* 将Date转换成formatStr格式的字符串
*
* @param date
* @param formatStr
* @return String
*/
public static String dateToDateString(Date date, String formatStr) {
DateFormat df = getDateFormat(formatStr);
return df.format(date);
}
/**
* 返回一个yyyy-MM-dd HH:mm:ss形式的日期时间字符串中的HH:mm:ss
*
* @param dateTime
* yyyy-MM-dd HH:mm:ss
* @return HH:mm:ss
*/
public static String getTimeString(String dateTime) {
return getTimeString(dateTime, DATATIMEF_STR);
}
/**
* 返回一个formatStr格式的日期时间字符串中的HH:mm:ss
*
* @param dateTime
* @param formatStr
* @return
*/
public static String getTimeString(String dateTime, String formatStr) {
Date d = getDate(dateTime, formatStr);
String s = dateToDateString(d);
return s.substring(DATATIMEF_STR.indexOf('H'));
}
/**
* 获取当前日期yyyy-MM-dd的形式
*
* @return yyyy-MM-dd
*/
public static String getCurDate() {
// return dateToDateString(new Date(),DATAFORMAT_STR);
return dateToDateString(Calendar.getInstance().getTime(),
DATAFORMAT_STR);
}
/**
* 获得指定格式的日期字符串
* @param formatStr 格式
* @return String
*/
public static String getCurDateString(String formatStr) {
return dateToDateString(Calendar.getInstance().getTime(),
formatStr);
}
/**
* 获取当前日期yyyy年MM月dd日的形式
*
* @return yyyy年MM月dd日
*/
public static String getCurZhCNDate() {
return dateToDateString(new Date(), ZHCN_DATAFORMAT_STR);
}
/**
* 获取当前日期时间yyyy-MM-dd HH:mm:ss的形式
*
* @return yyyy-MM-dd HH:mm:ss
*/
public static String getCurDateTime() {
return dateToDateString(new Date(), DATATIMEF_STR);
}
/**
* 获取当前日期时间yyyy年MM月dd日HH时mm分ss秒的形式
*
* @return yyyy年MM月dd日HH时mm分ss秒
*/
public static String getCurZhCNDateTime() {
return dateToDateString(new Date(), ZHCN_DATATIMEF_STR);
}
/**
* 获取日期d的days天后的一个Date
* @param d 日期
* @param days 天数
* @return Date
*/
public static Date getInternalDateByDay(Date d, int days) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
now.add(Calendar.DATE, days);
return now.getTime();
}
/**
* 获取日期date的days天后的一个Date
* @param date 日期
* @param days 天数
* @return days天后
*/
public static String getDateStringAfter(Date date, int days) {
//days后
Date d = getInternalDateByDay(new Date(), 90);
//字符串
return dateToDateString(d);
}
public static Date getInternalDateByMon(Date d, int months) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
now.add(Calendar.MONTH, months);
return now.getTime();
}
public static Date getInternalDateByYear(Date d, int years) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
now.add(Calendar.YEAR, years);
return now.getTime();
}
public static Date getInternalDateBySec(Date d, int sec) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
now.add(Calendar.SECOND, sec);
return now.getTime();
}
public static Date getInternalDateByMin(Date d, int min) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
now.add(Calendar.MINUTE, min);
return now.getTime();
}
public static Date getInternalDateByHour(Date d, int hours) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
now.add(Calendar.HOUR_OF_DAY, hours);
return now.getTime();
}
/**
* 根据一个日期字符串,返回日期格式,目前支持4种 如果都不是,则返回null
*
* @param DateString
* @return
*/
public static String getFormateStr(String DateString) {
String patternStr1 = "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"; // "yyyy-MM-dd"
String patternStr2 = "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}\\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}"; // "yyyy-MM-dd HH:mm:ss";
String patternStr3 = "[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日";// "yyyy年MM月dd日"
String patternStr4 = "[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日[0-9]{1,2}时[0-9]{1,2}分[0-9]{1,2}秒";// "yyyy年MM月dd日HH时mm分ss秒"
Pattern p = Pattern.compile(patternStr1);
Matcher m = p.matcher(DateString);
boolean b = m.matches();
if (b)
return DATAFORMAT_STR;
p = Pattern.compile(patternStr2);
m = p.matcher(DateString);
b = m.matches();
if (b)
return DATATIMEF_STR;
p = Pattern.compile(patternStr3);
m = p.matcher(DateString);
b = m.matches();
if (b)
return ZHCN_DATAFORMAT_STR;
p = Pattern.compile(patternStr4);
m = p.matcher(DateString);
b = m.matches();
if (b)
return ZHCN_DATATIMEF_STR;
return null;
}
/**
* 将一个"yyyy-MM-dd HH:mm:ss"字符串,转换成"yyyy年MM月dd日HH时mm分ss秒"的字符串
*
* @param dateStr
* @return String
*/
public static String getZhCNDateTime(String dateStr) {
Date d = getDate(dateStr);
return dateToDateString(d, ZHCN_DATATIMEF_STR);
}
/**
* 将一个"yyyy-MM-dd"字符串,转换成"yyyy年MM月dd日"的字符串
*
* @param dateStr
* @return
*/
public static String getZhCNDate(String dateStr) {
Date d = getDate(dateStr, DATAFORMAT_STR);
return dateToDateString(d, ZHCN_DATAFORMAT_STR);
}
/**
* 将dateStr从fmtFrom转换到fmtTo的格式
*
* @param dateStr
* @param fmtFrom
* @param fmtTo
* @return
*/
public static String getDateStr(String dateStr, String fmtFrom, String fmtTo) {
Date d = getDate(dateStr, fmtFrom);
return dateToDateString(d, fmtTo);
}
/**
* 比较两个"yyyy-MM-dd HH:mm:ss"格式的日期,之间相差多少毫秒,time2-time1
*
* @param time1
* @param time2
* @return
*/
public static long compareDateStr(String time1, String time2) {
Date d1 = getDate(time1);
Date d2 = getDate(time2);
return d2.getTime() - d1.getTime();
}
/**
* 将小时数换算成返回以毫秒为单位的时间
*
* @param hours
* @return
*/
public static long getMicroSec(BigDecimal hours) {
BigDecimal bd;
bd = hours.multiply(new BigDecimal(3600 * 1000));
return bd.longValue();
}
/**
* 获取Date中的分钟
*
* @param d
* @return
*/
public static int getMin(Date d) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
return now.get(Calendar.MINUTE);
}
/**
* 获取Date中的小时(24小时)
*
* @param d
* @return
*/
public static int getHour(Date d) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
return now.get(Calendar.HOUR_OF_DAY);
}
/**
* 获取Date中的秒
*
* @param d
* @return
*/
public static int getSecond(Date d) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
return now.get(Calendar.SECOND);
}
/**
* 获取xxxx-xx-xx的日
*
* @param d
* @return
*/
public static int getDay(Date d) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
return now.get(Calendar.DAY_OF_MONTH);
}
/**
* 获取月份,1-12月
*
* @param d
* @return
*/
public static int getMonth(Date d) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
return now.get(Calendar.MONTH) + 1;
}
/**
* 获取19xx,20xx形式的年
*
* @param d
* @return
*/
public static int getYear(Date d) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTime(d);
return now.get(Calendar.YEAR);
}
/**
* 得到d的上个月的年份+月份,如200505
*
* @return
*/
public static String getYearMonthOfLastMon(Date d) {
Date newdate = getInternalDateByMon(d, -1);
String year = String.valueOf(getYear(newdate));
String month = String.valueOf(getMonth(newdate));
return year + month;
}
/**
* 得到当前日期的年和月如200509
*
* @return String
*/
public static String getCurYearMonth() {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
String DATE_FORMAT = "yyyyMM";
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(
DATE_FORMAT);
sdf.setTimeZone(TimeZone.getDefault());
return (sdf.format(now.getTime()));
}
/**
* 输入年月获得下一月的日期
* @param year 年
* @param month 月
* @return Date
*/
public static Date getNextMonth(String year, String month) {
String datestr = year + "-" + month + "-01";
Date date = getDate(datestr, DATAFORMAT_STR);
return getInternalDateByMon(date, 1);
}
public static Date getLastMonth(String year, String month) {
String datestr = year + "-" + month + "-01";
Date date = getDate(datestr, DATAFORMAT_STR);
return getInternalDateByMon(date, -1);
}
/**
* 得到日期d,按照页面日期控件格式,如"2001-3-16"
*
* @param d
* @return
*/
public static String getSingleNumDate(Date d) {
return dateToDateString(d, DATAFORMAT_STR);
}
/**
* 得到d半年前的日期,"yyyy-MM-dd"
*
* @param d
* @return
*/
public static String getHalfYearBeforeStr(Date d) {
return dateToDateString(getInternalDateByMon(d, -6), DATAFORMAT_STR);
}
/**
* 得到当前日期D的月底的前/后若干天的时间,<0表示之前,>0表示之后
*
* @param d
* @param days
* @return
*/
public static String getInternalDateByLastDay(Date d, int days) {
return dateToDateString(getInternalDateByDay(d, days), DATAFORMAT_STR);
}
/**
* 日期中的年月日相加
*
* @param field
* int 需要加的字段 年 月 日
* @param amount
* int 加多少
* @return String
*/
public static String addDate(int field, int amount) {
int temp = 0;
if (field == 1) {
temp = Calendar.YEAR;
}
if (field == 2) {
temp = Calendar.MONTH;
}
if (field == 3) {
temp = Calendar.DATE;
}
String Time = "";
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
cal.add(temp, amount);
Time = sdf.format(cal.getTime());
return Time;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 获得系统当前月份的天数
*
* @return
*/
public static int getCurentMonthDay() {
Date date = Calendar.getInstance().getTime();
return getMonthDay(date);
}
/**
* 获得指定日期月份的天数
*
* @return
*/
public static int getMonthDay(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
return c.getActualMaximum(Calendar.DAY_OF_MONTH);
}
/**
* 获得指定日期月份的天数 yyyy-mm-dd
*
* @return
*/
public static int getMonthDay(String date) {
Date strDate = getDate(date, DATAFORMAT_STR);
return getMonthDay(strDate);
}
/**
* 获得日期
*
* @param cal
* Calendar
* @return String yyyy-mm-dd
*/
public static String getStringDate(Calendar cal) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.format(cal.getTime());
}
/**
* 获取当前月第一天
*
* @return yyyy-MM-dd
*/
public static String getCurrentMonthFirstDay() {
// 返回格式
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, 0);
// 设置为1号,当前日期既为本月第一天
c.set(Calendar.DAY_OF_MONTH, 1);
return format.format(c.getTime());
}
/**
* 获取本周的第一天
* @return String yyyy-MM-dd
*/
public static String getCurrentWeekFirstDay() {
int mondayPlus;
Calendar cd = Calendar.getInstance();
// 获得今天是一周的第几天,星期日是第一天,星期二是第二天......
// 因为按中国礼拜一作为第一天所以这里减1
int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1;
if (dayOfWeek == 1) {
mondayPlus = 0;
} else {
mondayPlus = 1 - dayOfWeek;
}
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus);
Date monday = currentDate.getTime();
DateFormat df = DateFormat.getDateInstance();
String preMonday = df.format(monday);
return preMonday;
}
/**
* 计算两个日期相差月数
* @param start 开始日期
* @param end 结束日期
* @return int
*/
public static int getMonth(Date start, Date end) {
//判断输入数据
if (start.after(end)) {
Date t = start;
start = end;
end = t;
}
//格式处理
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(start);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(end);
Calendar temp = Calendar.getInstance();
temp.setTime(end);
temp.add(Calendar.DATE, 1);
int year = endCalendar.get(Calendar.YEAR)
- startCalendar.get(Calendar.YEAR);
int month = endCalendar.get(Calendar.MONTH)
- startCalendar.get(Calendar.MONTH);
if ((startCalendar.get(Calendar.DATE) == 1)
&& (temp.get(Calendar.DATE) == 1)) {
return year * 12 + month + 1;
} else if ((startCalendar.get(Calendar.DATE) != 1)
&& (temp.get(Calendar.DATE) == 1)) {
return year * 12 + month;
} else if ((startCalendar.get(Calendar.DATE) == 1)
&& (temp.get(Calendar.DATE) != 1)) {
return year * 12 + month;
} else {
return (year * 12 + month - 1) < 0 ? 0 : (year * 12 + month);
}
}
/**
* Timestamp To java.sql.Date
* @param timestamp 实例
* @return java.sql.Date
*/
public static java.sql.Date timestampToSqlDate(Timestamp timestamp) {
java.sql.Date date = new java.sql.Date(timestamp.getTime());
return date;
}
/**
* 字符串转换为SQlDate
* @param dateString 时间字符串
* @return java.sql.Date
*/
public static java.sql.Date stringToSqlDate(String dateString) {
Date date = getDate(dateString, DATAFORMAT_STR);
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
return sqlDate;
}
/**
* 获取当前时间戳
* @return Timestamp
*/
public static Timestamp getSqlTimestamp() {
Date date = new Date();
return new Timestamp(date.getTime());
}
}
