前言
在项目的开发过程中,经常会遇到时间的处理,如果不提取封装进行重用,如果在大型项目中时间处理较多的情况下,不这样做,可能会出现代码冗余严重的情况,这儿记录一下常用的时间处理方法,后期会不断的完善和优化,可以拿来即用哦。。
分段代码示例
1、设置常用的公共的静态常量,代码段如下:
public static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd";
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
public static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static final SimpleDateFormat UPPER_TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
public static final SimpleDateFormat LOWER_TIME_FORMAT = new SimpleDateFormat("hh:mm:ss");
public static final SimpleDateFormat CHAR_TIME_FORMAT = new SimpleDateFormat("hh小时mm分ss秒");
public static final int DAYS_OF_ONE_WEEK = 7;
2、获得某天最大时间,例如: yyyy-MM-dd 23:59:59,代码段如下:
public static String getEndOfDay(Date date)
{
// 获取本地标准时间(本地默认的时区时间)
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()),
ZoneId.systemDefault());
LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
Date from = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
String strDete = DateTimeUtils.DATE_TIME_FORMAT.format(from);
return strDete;
}
3、获取当前日期是一周中的第几天、星期几,代码段如下:
public static long getWeekDay(Date today)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(today);
return calendar.get(Calendar.DAY_OF_WEEK);
}
4、计算距离baseDate 若干天的 日期,例如:days=2 表示2天后的当前日期,days=-1 表示一天前的当前日期,代码段如下:
public static Date daysBetweenWeeks(Date baseDate, int days)
{
Calendar calendar = Calendar.getInstance();
if (baseDate != null)
{
calendar.setTime(baseDate);
}
calendar.add(Calendar.DAY_OF_MONTH, days);
return calendar.getTime();
}
5、获取某个日期对应的周一的当前日期,如果入参为null的话,表示获取当前日期,代码段如下:
public static Date mondayOfThisWeek(Date date)
{
Calendar calendar = Calendar.getInstance();
if (date != null)
{
calendar.setTime(date);
}
// 获取周一
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
return calendar.getTime();
}
6、获取上周一的当前日期,代码段如下:
public static Date lastMonday()
{
Date date = daysBetweenWeeks(null, -DAYS_OF_ONE_WEEK);
return mondayOfThisWeek(date);
}
7、获取某个日期的 周日 日期,如果入参日期为 null 的话,表示获取当前日期的周日,注意:日历获取的周期是 周日,1,2,3,4,5,6 不是中国传统的 1,2,3,4,5,6,周日 所以要加7,代码段如下:
public static Date sundayOfThisWeek(Date date)
{
Calendar calendar = Calendar.getInstance();
if (date != null)
{
calendar.setTime(date);
}
// 获取周日
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
// 获取 中国意义上的 周日
calendar.add(Calendar.DAY_OF_MONTH, 7);
if (getWeekDay(date) == 1)
{
calendar.add(Calendar.DATE, calendar.getFirstDayOfWeek() - 8);
}
return calendar.getTime();
}
8、获取上周日的日期,代码段如下:
public static Date lastSunday()
{
Date date = daysBetweenWeeks(null, -DAYS_OF_ONE_WEEK);
return sundayOfThisWeek(date);
}
9、字符串转换为日期类型,时间格式:YYYY_MM_DD,代码段如下:
public static Date stringToDate(String str)
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
return sdf.parse(str);
} catch (ParseException e)
{
e.printStackTrace();
}
return null;
}
10、日期类型转换为字符串类型,字符串格式:YYYY_MM_DD,代码段如下:
public static String dateToString(Date date)
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
return sdf.format(date);
} catch (Exception e)
{
System.out.println(e.getMessage());
}
return date.toString();
}
11、时间类型转换为日期类型,日期格式:YYYY:MM:DD hh:mm:ss --->YYYY:MM:DD,代码段如下:
public static Date timeToDate(Date date)
{
SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
String str = sdf.format(date);
try
{
return sdf.parse(str);
} catch (ParseException e)
{
e.printStackTrace();
}
return null;
}
12、获取某天当前周的周一的日期,代码段如下:
public static Date getThisWeekMonday(Date date)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 获得当前日期是一个星期的第几天
int dayWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek)
{
calendar.add(Calendar.DAY_OF_MONTH, -1);
}
calendar.setFirstDayOfWeek(Calendar.MONDAY);
int day = calendar.get(Calendar.DAY_OF_WEEK);
// 根据日历的规则,当前日期减去 星期几与一个星期第一天的差值 即可计算当前周期第一天
calendar.add(Calendar.DATE, calendar.getFirstDayOfWeek() - day);
return calendar.getTime();
}
13、获取某天上周一的日期,代码段如下:
public static Date geLastWeekMonday(Date date)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(getThisWeekMonday(date));
calendar.add(Calendar.DATE, -7);
return calendar.getTime();
}
14、获取某天下周一的日期,代码段如下:
public static Date getNextWeekMonday(Date date)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(getThisWeekMonday(date));
calendar.add(Calendar.DATE, 7);
return calendar.getTime();
}
15、获取某天的前/后几天的日期,“+” 表示获取往后多少天的日期,“-” 表示获取往前多少天的日期,代码段如下:
public static Date addDay(Date date, int day)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, day);
return calendar.getTime();
}
16、多个日期时间相加的,获得总的时长,代码段如下:
public Date plusDate(List dates)
{
int hour;
int minute;
int second;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
for (Date date : dates)
{
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
String str = sdf.format(date);
String[] split = str.split(":");
hour += Integer.parseInt(split[0]);
minute += Integer.parseInt(split[1]);
second += Integer.parseInt(split[2]);
}
Calendar instance = Calendar.getInstance();
String s = simpleDateFormat.format(dates.get(0));
String[] split = s.split("-");
instance.set(Integer.parseInt(split[0]), Integer.parseInt(split[1]), Integer.parseInt(split[2]), hour, minute,
second);
return instance.getTime();
}
17、获取初始化日期格式化,格式:yyyy-MM-dd,代码段如下:
public static Date dateFormatDate(Date date)
{
Date parse = null;
try
{
String strDate = DATE_FORMAT.format(date);
parse = DATE_FORMAT.parse(strDate);
} catch (ParseException e)
{
e.printStackTrace();
}
return parse;
}
18、获取初始化日期格式化,格式:hh小时mm分ss秒,代码段如下:
public static Date dateFormatChar(Date date)
{
Date parse = null;
try
{
String strDate = CHAR_TIME_FORMAT.format(date);
parse = CHAR_TIME_FORMAT.parse(strDate);
} catch (ParseException e)
{
e.printStackTrace();
}
return parse;
}
完整代码示例
Java日期工具类,时间格式化,获取某天的最大时间,获取当前日期是一周中的第几天、星期几,日期计算-两个日期相加以及求差等的操作,完整代码示例如下:
package com.btc.microservice.common.utils;
import org.apache.commons.lang3.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
*
* @author HuaZai
* @contact [email protected]
*
* @description
* - 日期工具类
*
- {@docRoot java.util.Calendar}
*
* @className DateTimeUtils
* @package com.btc.microservice.common.utils
* @createdTime 2016年8月20日 下午10:17:40
*
* @version V1.0.0
*/
public class DateTimeUtils
{
public static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd";
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
public static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static final SimpleDateFormat UPPER_TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
public static final SimpleDateFormat LOWER_TIME_FORMAT = new SimpleDateFormat("hh:mm:ss");
public static final SimpleDateFormat CHAR_TIME_FORMAT = new SimpleDateFormat("hh小时mm分ss秒");
public static final int DAYS_OF_ONE_WEEK = 7;
/**
*
* @author HuaZai
* @contact [email protected]
* @title getEndOfDay
*
* @description
* - 获得某天最大时间 yyyy-MM-dd 23:59:59
*
* @createdTime 2016年8月20日 下午10:18:19
* @param date
* @return
* @return String
*
* @version : V1.0.0
*/
public static String getEndOfDay(Date date)
{
// 获取本地标准时间(本地默认的时区时间)
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()),
ZoneId.systemDefault());
LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
Date from = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
String strDete = DateTimeUtils.DATE_TIME_FORMAT.format(from);
return strDete;
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title getWhicthDay
*
* @description
* - 获取当前日期是一周中的第几天、星期几
*
* @createdTime 2016年8月20日 下午10:20:14
* @param today
* @return
* @return long
*
* @version : V1.0.0
*/
public static long getWeekDay(Date today)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(today);
return calendar.get(Calendar.DAY_OF_WEEK);
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title daysBetweenWeeks
*
* @description
* - 计算距离baseDate 若干天的 日期,例如:
*
- days=2 表示2天后的当前日期
*
- days=-1 表示一天前的当前日期
*
* @createdTime 2016年8月20日 下午5:19:12
* @param baseDate
* @param days
* @return
* @return Date
*
* @version : V1.0.0
*/
public static Date daysBetweenWeeks(Date baseDate, int days)
{
Calendar calendar = Calendar.getInstance();
if (baseDate != null)
{
calendar.setTime(baseDate);
}
calendar.add(Calendar.DAY_OF_MONTH, days);
return calendar.getTime();
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title lastMonday
*
* @description
* - 获取上周一的当前日期
*
* @createdTime 2016年8月20日 下午5:21:12
* @return
* @return Date
*
* @version : V1.0.0
*/
public static Date lastMonday()
{
Date date = daysBetweenWeeks(null, -DAYS_OF_ONE_WEEK);
return mondayOfThisWeek(date);
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title lastSunday
*
* @description
* - 获取上周日的日期
*
* @createdTime 2016年8月20日 下午5:23:15
* @return
* @return Date
*
* @version : V1.0.0
*/
public static Date lastSunday()
{
Date date = daysBetweenWeeks(null, -DAYS_OF_ONE_WEEK);
return sundayOfThisWeek(date);
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title mondayOfThisWeek
*
* @description
* - 获取某个日期对应的周一的当前日期
*
* @createdTime 2016年8月21日 下午8:21:19
* @param date
* 如果日期为null的话,表示获取当前日期
* @return Date
*
* @version : V1.0.0
*/
public static Date mondayOfThisWeek(Date date)
{
Calendar calendar = Calendar.getInstance();
if (date != null)
{
calendar.setTime(date);
}
// 获取周一
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
return calendar.getTime();
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title sundayOfThisWeek
*
* @description
* - 获取某个日期的 周日 日期
*
* @createdTime 2016年8月21日 下午8:33:55
* @param date
* 如果入参日期为 null 的话,表示获取当前日期的周日
* 注意:日历获取的周期是 周日,1,2,3,4,5,6 不是中国传统的 1,2,3,4,5,6,周日 所以要加7
* @return Date
*
* @version : V1.0.0
*/
public static Date sundayOfThisWeek(Date date)
{
Calendar calendar = Calendar.getInstance();
if (date != null)
{
calendar.setTime(date);
}
// 获取周日
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
// 获取 中国意义上的 周日
calendar.add(Calendar.DAY_OF_MONTH, 7);
if (getWeekDay(date) == 1)
{
calendar.add(Calendar.DATE, calendar.getFirstDayOfWeek() - 8);
}
return calendar.getTime();
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title stringToDate
*
* @description 字符串转换为日期类型,时间格式:YYYY_MM_DD
*
* @createdTime 2016年8月21日 下午8:49:53
* @param dateString
* @return
* @return Date
*
* @version : V1.0.0
*/
public static Date stringToDate(String str)
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
return sdf.parse(str);
} catch (ParseException e)
{
e.printStackTrace();
}
return null;
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title dateToString
*
* @description 日期类型转换为字符串类型,字符串格式:YYYY_MM_DD
*
* @createdTime 2016年8月21日 下午8:51:31
* @param date
* @return
* @return String
*
* @version : V1.0.0
*/
public static String dateToString(Date date)
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
return sdf.format(date);
} catch (Exception e)
{
System.out.println(e.getMessage());
}
return date.toString();
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title timeToDate
*
* @description 时间类型转换为日期类型,日期格式:YYYY:MM:DD hh:mm:ss --->YYYY:MM:DD
*
* @createdTime 2016年8月21日 下午8:53:41
* @param date
* @return
* @return Date
*
* @version : V1.0.0
*/
public static Date timeToDate(Date date)
{
SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
String str = sdf.format(date);
try
{
return sdf.parse(str);
} catch (ParseException e)
{
e.printStackTrace();
}
return null;
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title getThisWeekMonday
*
* @description 获取某天当前周的周一的日期
*
* @createdTime 2016年8月21日 下午8:58:15
* @param date
* @return
* @return Date
*
* @version : V1.0.0
*/
public static Date getThisWeekMonday(Date date)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 获得当前日期是一个星期的第几天
int dayWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek)
{
calendar.add(Calendar.DAY_OF_MONTH, -1);
}
calendar.setFirstDayOfWeek(Calendar.MONDAY);
int day = calendar.get(Calendar.DAY_OF_WEEK);
// 根据日历的规则,当前日期减去 星期几与一个星期第一天的差值 即可计算当前周期第一天
calendar.add(Calendar.DATE, calendar.getFirstDayOfWeek() - day);
return calendar.getTime();
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title geLastWeekMonday
*
* @description 获取某天上周一的日期
*
* @createdTime 2016年8月21日 下午9:00:21
* @param date
* @return
* @return Date
*
* @version : V1.0.0
*/
public static Date geLastWeekMonday(Date date)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(getThisWeekMonday(date));
calendar.add(Calendar.DATE, -7);
return calendar.getTime();
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title getNextWeekMonday
*
* @description 获取某天下周一的日期
*
* @createdTime 2016年8月21日 下午9:01:21
* @param date
* @return
* @return Date
*
* @version : V1.0.0
*/
public static Date getNextWeekMonday(Date date)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(getThisWeekMonday(date));
calendar.add(Calendar.DATE, 7);
return calendar.getTime();
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title addDay
*
* @description
* - 获取某天的前/后几天的日期
*
* @createdTime 2016年8月22日 上午10:15:51
* @param date
* @param day
* + 表示获取往后多少天的日期
* - 表示获取往前多少天的日期
* @return Date
*
* @version : V1.0.0
*/
public static Date addDay(Date date, int day)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, day);
return calendar.getTime();
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title addTime
*
* @description 添加指定日期
*
* @createdTime 2016年8月22日 上午10:21:30
* @param date
* @param time
* 时间格式为: HH:mm:ss
* @return Date
*
* @version : V1.0.0
*/
public static Date addTime(Date date, String time)
{
if (StringUtils.isEmpty(time))
{
return date;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 先分别获取-> 时,分,秒 分别进行计算
String[] times = time.split(":");
int[] timeUnit =
{ Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND };
if (date != null)
{
for (int i = 0; i < times.length; i++)
{
calendar.add(timeUnit[i], Integer.valueOf(times[i]));
}
}
return calendar.getTime();
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title plusDate
*
* @description 多个日期时间相加的,获得总的时长
*
* @createdTime 2016年8月22日 上午10:25:32
* @param dates
* 日期集合
* @return Date
*
* @version : V1.0.0
*/
public Date plusDate(List dates)
{
int hour;
int minute;
int second;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
for (Date date : dates)
{
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
String str = sdf.format(date);
String[] split = str.split(":");
hour += Integer.parseInt(split[0]);
minute += Integer.parseInt(split[1]);
second += Integer.parseInt(split[2]);
}
Calendar instance = Calendar.getInstance();
String s = simpleDateFormat.format(dates.get(0));
String[] split = s.split("-");
instance.set(Integer.parseInt(split[0]), Integer.parseInt(split[1]), Integer.parseInt(split[2]), hour, minute,
second);
return instance.getTime();
}
/**
* 获取初始化日期格式化
*
* @param day
* :获取初始化日期格式化
*/
/**
*
* @author HuaZai
* @contact [email protected]
* @title dateFormatDate
*
* @description 获取初始化日期格式化,格式:yyyy-MM-dd
*
* @createdTime 2016年8月22日 上午10:39:28
* @param date
* 格式化的日期
* @return Date
*
* @version : V1.0.0
*/
public static Date dateFormatDate(Date date)
{
Date parse = null;
try
{
String strDate = DATE_FORMAT.format(date);
parse = DATE_FORMAT.parse(strDate);
} catch (ParseException e)
{
e.printStackTrace();
}
return parse;
}
/**
*
* @author HuaZai
* @contact [email protected]
* @title dateFormatChar
*
* @description 获取初始化日期格式化,格式:hh小时mm分ss秒
*
* @createdTime 2016年8月22日 上午10:44:08
* @param date
* 格式化的日期
* @return Date
*
* @version : V1.0.0
*/
public static Date dateFormatChar(Date date)
{
Date parse = null;
try
{
String strDate = CHAR_TIME_FORMAT.format(date);
parse = CHAR_TIME_FORMAT.parse(strDate);
} catch (ParseException e)
{
e.printStackTrace();
}
return parse;
}
}
好了,关于 Java日期工具类,时间格式化,获取某天的最大时间,获取当前日期是一周中的第几天、星期几,日期计算-两个日期相加以及求差 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。
作 者: | 华 仔 |
联系作者: | [email protected] |
来 源: | CSDN (Chinese Software Developer Network) |
原 文: | https://blog.csdn.net/Hello_World_QWP/article/details/85913980 |
版权声明: | 本文为博主原创文章,请在转载时务必注明博文出处! |