Java常用日期工具类,常规的日期、时间格式转换,字符串转Date对象,Date对象转字符串,日期比较,日期添加指定年、月、天等,计算两个日期之间相差的天数、月数、年数等;
DateUtils.java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* @author JL
* @version V1.0
* @Description 用java.util.Calendar封装日期、时间操作工具类
*/
public class DateUtils {
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final String HH_MM_SS = "HH:mm:ss";
public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static final String YYYYMMDD = "yyyyMMdd";
public static final String HHMMSS = "HHmmss";
public static String getTimeStr(Date date, String pattern){
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.format(date);
}
public static String getTimeStr(String pattern){
return getTimeStr(new Date(), pattern);
}
public static String getTimeStr(Date date){
return getTimeStr(date, YYYY_MM_DD_HH_MM_SS);
}
public static String getTimeStr(){
return getTimeStr(new Date(), YYYY_MM_DD_HH_MM_SS);
}
public static String getDateStr(Date date){
return getTimeStr(date, YYYY_MM_DD);
}
public static String getDateStr(){
return getTimeStr(new Date(), YYYY_MM_DD);
}
public static Long getTimeToLong(){
return Long.parseLong(getTimeStr(new Date(), YYYYMMDDHHMMSS));
}
public static Long getTimeToLong(String timeStr){
timeStr = timeStr.replaceAll("-","");
timeStr = timeStr.replaceAll("/","");
timeStr = timeStr.replaceAll(" ","");
timeStr = timeStr.replaceAll(":","");
return Long.parseLong(timeStr);
}
public static Long getTimeToLong(Date date){
return Long.parseLong(getTimeStr(date, YYYYMMDDHHMMSS));
}
public static Date getTime(String timeStr, String pattern){
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
try{
return sdf.parse(timeStr);
}catch(ParseException pe){
System.out.println("时间格式不对:" + pe.getMessage());
}
return null;
}
public static Date getTime(String timeStr){
return getTime(timeStr, YYYY_MM_DD_HH_MM_SS);//默认YYYY_MM_DD_HH_MM_SS
}
public static Date getDate(String dateStr){
return getTime(dateStr, YYYY_MM_DD);//默认YYYY_MM_DD
}
public static int getYear(){
return Calendar.getInstance().get(Calendar.YEAR);
}
public static int getMonth(){
return Calendar.getInstance().get(Calendar.MONTH) + 1;
}
public static int getDay(){
return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
}
public static Date addDayDate(int amount){
return addTimeDate(Calendar.DAY_OF_MONTH, amount);
}
public static int addDay(int amount){
return addTime(Calendar.DAY_OF_MONTH, amount);
}
public static Date addMonthDate(int amount){
return addTimeDate(Calendar.MONTH, amount);
}
public static int addMonth(int amount){
return addTime(Calendar.MONTH, amount);
}
public static Date addYearDate(int amount){
return addTimeDate(Calendar.YEAR, amount);
}
public static int addYear(int amount){
return addTime(Calendar.YEAR, amount);
}
public static Date addMillisecondDate(long amout){
return new Date(addMillisecond(amout));
}
public static long addMillisecond(long amout){
return new Date().getTime() + amout;
}
//按不同的单位,添加时间值,返回添加后的时间值
public static int addTime(int field, int amount){
Calendar calendar = Calendar.getInstance();
calendar.add(field, amount);
return calendar.get(field);
}
//按不同的单位,添加时间值,返回date对象
public static Date addTimeDate(int field, int amount){
Calendar calendar = Calendar.getInstance();
calendar.add(field, amount);
return calendar.getTime();
}
//相差年数(按月数统计,如果不按月数统计,直接取年份相减即可)
public static int differYear(Date date1, Date date2){
int dMonth = differMonth(date1, date2);
return dMonth > 0 ? dMonth / 12 : 0;
}
//相差月数(精确到天)
public static int differMonth(Date date1, Date date2){
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
//年相减 * 12 + 月相减
int year = calendar1.get(Calendar.YEAR) - calendar2.get(Calendar.YEAR);
int month = calendar1.get(Calendar.MONTH) - calendar2.get(Calendar.MONTH);
int day = calendar1.get(Calendar.DAY_OF_MONTH) - calendar2.get(Calendar.DAY_OF_MONTH);
//按自然天推算,如:本月25号,到下月5号,只相差10天(按30天计算),不足一个月,需要减一个月
//大于1,是因为按天,一个月从1号到30号算一个完整月,到下个月1号,已经多了一天
//说明,day2在day1的前面2天,相差的天数,不足一个月,如:本月25号到下月24号为一个完整自然月;
if (day > 1){
return year * 12 + month - 1;
}
return year * 12 + month;
}
//相差天数
public static long differDay(Date date1, Date date2){
long time = date1.getTime() - date2.getTime();
return time / (1000*60*60*24);
}
//是否同一天,不管时分秒
public static boolean isSameDay(Date date1, Date date2){
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
return cal1.get(0) == cal2.get(0) && cal1.get(1) == cal2.get(1) && cal1.get(6) == cal2.get(6);
}
//是否同一天,毫秒级
public static boolean isSameInstant(Date date1, Date date2){
return date1.getTime() == date2.getTime();
}
//一周中的第几天,默认从周日(0)开始计算
public static int getWeek(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_WEEK);
}
//一年中的第几个季度
public static int getSeason(Date date) {
int season = 1;
Calendar c = Calendar.getInstance();
c.setTime(date);
int month = c.get(Calendar.MONTH);
switch (month) {
case Calendar.JANUARY:
case Calendar.FEBRUARY:
case Calendar.MARCH:
season = 1;
break;
case Calendar.APRIL:
case Calendar.MAY:
case Calendar.JUNE:
season = 2;
break;
case Calendar.JULY:
case Calendar.AUGUST:
case Calendar.SEPTEMBER:
season = 3;
break;
case Calendar.OCTOBER:
case Calendar.NOVEMBER:
case Calendar.DECEMBER:
season = 4;
break;
}
return season;
}
public static void main(String[] args) {
System.out.println(getYear()+"\t"+getMonth()+"\t"+getDay());
System.out.println(getTimeToLong());
System.out.println(getTimeToLong("2019-01-12 22:10:01"));
System.out.println(getTimeToLong("2019/01/12 22:10:01"));
System.out.println(getTimeToLong(new Date()));
System.out.println(getTimeStr(new Date(),HH_MM_SS));
System.out.println(addDay(-13));
System.out.println(addMillisecond(15000));
System.out.println(getTimeStr(addDayDate(-5)));
System.out.println(differDay(getTime("2019-06-25 20:00:00"), getTime("2019-06-20 21:59:59")));
System.out.println(differYear(getTime("2019-06-25 20:00:00"), getTime("2017-06-26 21:59:59")));
System.out.println(getWeek(new Date()));
}
}
说明:
做过项目的人都知道,很多写过的可重复利用的代码块或有用的工具类没有怎么整理,当需要的时候,又得打开项目查找一翻,虽然功能开发不难,但是又得花时间成本去写去测试,这样的重复造轮子的事情太多次了;因此不如把轮子保留,供大家一起使用;
1.这个轮子可以有:需要使用的时候确实还不存在这个组件。
2.我需要的时候轮子不在:每一种技术或工具产生都有它的项目背景,当代码写在项目里的时候,我知道有这个东西,当换了一个项目或公司后,没有备份也没有记录,这个时候你不在了,又得花时间手打一遍;
3.我不知道是不是造轮子:大多数情况下初学者很难分清楚自己是不是在重复造轮子,事实上造轮子不是我目的。我的目的是完成工作任务,任务完成的速度越快越好,质量越高越好。而不是去判断自己在不在造轮子。
4.不想重复花时间造轮子:有时候还会碰到一些并不困难但是很占时间的东西,当然有现成的轮子是花时间最少的;
5.我就是想学习轮子:初学者的并不是在重复造轮子,而是学习后以提高为自己的知识与技能。
轮子有过测试,但难免有失误,如有错误处,还敬请指出;