最近工作时经常处理日期,想起以前sql server中datediff,dateadd 等方法非常好用,于是想在java中实现类以的功能,而且提高精度,所以初步有了以下代码:
package com.test.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 日期工具类
* @author George.Zheng
* @datetime 2017/10/10 11:32
*/
public class DateUtils {
public static String format(Date date, String pattern) {
if ( null == date ) return "";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.format(date);
}
/**
* 得到当前时间字符串 格式(yyyy-MM-dd)
*/
public static String getCurrentDate() {
return format(new Date(), "yyyy-MM-dd");
}
/**
* 得到当前时间字符串
*/
public static String getCurrentDate(String pattern) {
return format(new Date(), pattern);
}
/**
* 得到当前时间字符串 格式(HH:mm:ss)
*/
public static String getCurrentTime() {
return format(new Date(), "HH:mm:ss");
}
/**
* 得到当前时间字符串
*/
public static String getCurrentTime(String pattern) {
return format(new Date(), pattern);
}
/**
* 得到当前日期和时间字符串 格式(yyyy-MM-dd HH:mm:ss)
*/
public static String getCurrentDateTime() {
return format(new Date(), "yyyy-MM-dd HH:mm:ss");
}
/**
* 得到当前日期和时间字符串 格式(yyyy-MM-dd HH:mm:ss)
*/
public static String getCurrentDateTime(String pattern) {
return format(new Date(), pattern);
}
/**
* 得到当前年份字符串 格式(yyyy)
*/
public static String getYear() {
return format(new Date(), "yyyy");
}
/**
* 得到当前月份字符串 格式(MM)
*/
public static String getMonth() {
return format(new Date(), "MM");
}
/**
* 得到当天字符串 格式(dd)
*/
public static String getDay() {
return format(new Date(), "dd");
}
/**
* 得到当前星期字符串 格式(E)星期几
*/
public static String getWeek() {
return format(new Date(), "E");
}
/**
* 日期型字符串转化为日期 格式
*/
public static Date parse(String strDate, String pattern) {
if (strDate == null){
return null;
}
try {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.parse(strDate);
} catch (ParseException e) {
return null;
}
}
/**
* @author Geoge.Zheng 2017/10/10 11:32 获取两个日期之间的差值
* @param datepart 日期差值类型
* (Calendar.DATE: 天数, Calendar.HOUR: 小时数, Calendar.MINUTE: 分钟数; Calendar.SECOND: 秒数
* Calendar.MONTH: 月数, Calendar.YEAR: 年数
* @param startdate 较之前的时间
* @param enddate 较之后的时间
* @return 差值
* @throws Exception
*/
public static double dateDiff(int datepart, Date startdate, Date enddate) throws Exception {
long starttime = startdate.getTime();
long endtime = enddate.getTime();
if(Calendar.DATE == datepart) {
return (endtime - starttime) / (1000 * 60 * 60 * 24); // 一天 1000 * 60 * 60 * 24 ms
} else if(Calendar.MINUTE == datepart) {
return (endtime - starttime) / (1000 * 60 * 60); // 一小时 1000 * 60 * 60 ms
} else if(Calendar.HOUR == datepart) {
return (endtime - starttime) / (1000 * 60); // 一分钟 1000 * 60 ms
} else if(Calendar.SECOND == datepart) {
return (endtime - starttime) / (1000); // 一秒钟 1000 ms
}
Calendar cs = Calendar.getInstance(), ce = Calendar.getInstance();
cs.setTime(startdate); ce.setTime(enddate);
if(Calendar.MONTH == datepart) {
int ds = cs.get(Calendar.DAY_OF_MONTH), de = ce.get(Calendar.DAY_OF_MONTH);
int dss = getMonthLastDay(startdate);
//int des = getMonthLastDay(enddate);
int result = ce.get(Calendar.MONTH) - cs.get(Calendar.MONTH);
int myear = (ce.get(Calendar.YEAR) - cs.get(Calendar.YEAR))*12;
double dday = 0.00;
if(ds != de) { // 日期不相等时采用此比例差值(以较早日期所在月的天数为分母作差值比例)
dday = (double)(de - ds)/dss;
}
return myear + result + dday;
} else if(Calendar.YEAR == datepart) {
int ds = cs.get(Calendar.DAY_OF_YEAR), de = ce.get(Calendar.DAY_OF_YEAR);
int dss = isLeapYear(startdate) ? 366 : 365;
//int des = isLeapYear(enddate) ? 366 : 365;
int dyear = ce.get(Calendar.YEAR) - cs.get(Calendar.YEAR);
double dday = 0.00;
if(ds != de) { // 日期不相等时采用此比例差值(以较早日期所在月的天数为分母作差值比例)
dday = (double)(de -ds)/dss;
}
return dyear + dday;
} else {
throw new Exception("Unsupported Datepart");
}
}
/**
* @author Geoge.Zheng 2017/10/10 11:32 日期加上(秒数/分钟数/小时数/天数/月数/年数)
* @param datepart 日期区间类型
* (Calendar.DATE: 天数, Calendar.HOUR: 小时数, Calendar.MINUTE: 分钟数; Calendar.SECOND: 秒数
* Calendar.MONTH: 月数, Calendar.YEAR: 年数
* @param number 加的数据值
* @param date 日期
* @return 差值
* @throws Exception
*/
public static Date dateAdd(int datepart, int number, Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
if(Calendar.SECOND == datepart) {
c.add(Calendar.SECOND, number);
} else if (Calendar.MINUTE == datepart) {
c.add(Calendar.MINUTE, number);
} else if (Calendar.HOUR == datepart) {
c.add(Calendar.HOUR, number);
} else if (Calendar.DATE == datepart) {
c.add(Calendar.DATE, number);
} else if (Calendar.MONTH == datepart) {
c.add(Calendar.MONTH, number);
} else if (Calendar.YEAR == datepart) {
c.add(Calendar.YEAR, number);
}
return c.getTime();
}
/**
* @author Geoge.Zheng 2017/10/10 11:32 得到指定日期该月的天数
* @param date 日期
*/
public static int getMonthLastDay(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.DATE , 1); // 把日期设为当月第一天
c.roll(Calendar.DATE, -1); // 日期回滚一天,也就是当月最后一天
return c.get(Calendar.DATE);
}
/**
* @author Geoge.Zheng 2017/10/10 11:32 判断是否闰年
* @param date 日期
*/
public static boolean isLeapYear(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
// 把日期设为12月31
c.set(Calendar.MONTH, Calendar.DECEMBER);
c.set(Calendar.DATE, 31);
return (c.get(Calendar.DAY_OF_YEAR)==366);
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
System.out.println(parse("2014-04-01 17:20:39", "yyyy-MM-dd HH:MM:SS"));
System.out.println(getCurrentDate("yyyyMMddHHmmss"));
String pattern = "yyyy-MM-dd";
String d1 = "2016-01-10", d2 = "2016-02-09", d3 = "2016-02-11";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-01-02"; d2 = "2016-02-01"; d3 = "2016-02-03";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-01-09"; d2 = "2016-02-08"; d3 = "2016-02-10";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-01-10"; d2 = "2016-02-09"; d3 = "2016-02-11";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-01-13"; d2 = "2016-02-12"; d3 = "2016-02-14";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-01-28"; d2 = "2016-02-27"; d3 = "2016-03-01";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-02-02"; d2 = "2016-03-01"; d3 = "2016-03-03";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-02-28"; d2 = "2016-03-01"; d3 = "2016-03-03";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-02-28"; d2 = "2016-03-27"; d3 = "2016-03-29";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-02-28"; d2 = "2016-03-30"; d3 = "2016-03-31";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
d1 = "2016-11-10"; d2 = "2016-11-20"; d3 = "2016-12-10";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
System.out.println("Year diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.YEAR, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.YEAR, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.YEAR, parse(d2, pattern), parse(d3, pattern)));
// -- 2016-11-10 2016-12-10
// 2017-01-10
d2 = "2017-01-08"; d3 = "2017-01-11";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
System.out.println("Year diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.YEAR, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.YEAR, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.YEAR, parse(d2, pattern), parse(d3, pattern)));
// -- 2016-11-10 2016-12-10
// 2017-01-10 -- 2017-11-10 2017-12-10
// 2018-01-10 -- 2018-11-10 2018-12-10
// 2019-01-10
d2 = "2018-01-08"; d3 = "2018-01-11";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
System.out.println("Year diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.YEAR, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.YEAR, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.YEAR, parse(d2, pattern), parse(d3, pattern)));
d2 = "2019-01-08"; d3 = "2019-01-11";
System.out.println("Month diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.MONTH, parse(d2, pattern), parse(d3, pattern)));
System.out.println("Year diff: ["+d1+" ~ "+d2+"]=" + dateDiff(Calendar.YEAR, parse(d1, pattern), parse(d2, pattern)) + ", ["+d1+" ~ "+d3+"]=" + dateDiff(Calendar.YEAR, parse(d1, pattern), parse(d3, pattern)) + ", ["+d2+" ~ "+d3+"]=" + dateDiff(Calendar.YEAR, parse(d2, pattern), parse(d3, pattern)));
pattern = "yyyy-MM-dd HH:mm:ss";
Date d = parse("2017-09-25 13:58:51", pattern);
System.out.println(format(dateAdd(Calendar.SECOND, 10, d), pattern));
System.out.println(format(dateAdd(Calendar.MINUTE, 10, d), pattern));
System.out.println(format(dateAdd(Calendar.HOUR, 10, d), pattern));
System.out.println(format(dateAdd(Calendar.DATE, 10, d), pattern));
System.out.println(format(dateAdd(Calendar.MONTH, 10, d), pattern));
System.out.println(format(dateAdd(Calendar.YEAR, 10, d), pattern));
}
}