JAVA 时间日期 处理
关于获取时间日期工具类 包括 求出(当月星期、 日期的区间、获取当前Date型日期、获取当前日期, 默认格式yyyy-MM-dd、计算两个时间差)等等。
class包括(DateUtils、DateWeekModel、DayWeek 分别为 时间工具类、日期周期模型、星期枚举类)方便后端以后对时间处理更方便
时间工具类 Class DateUtils
package com.hanwei.common.utils.date;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.lang.management.ManagementFactory;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.stream.Stream;
/**
* 时间工具类
*
* @author SunYg
*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM";
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public static String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
private static String[] parsePatterns = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
/**
* 获取当前Date型日期
*
* @return Date() 当前日期
*/
public static Date getNowDate() {
return new Date();
}
/**
* 获取当前日期, 默认格式为yyyy-MM-dd
*
* @return String
*/
public static String getDate() {
return dateTimeNow(YYYY_MM_DD);
}
public static final String getTime() {
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
}
public static final String getDateTime() {
return dateTimeNow(YYYY_MM_DD_HH_MM);
}
public static final String dateTimeNow() {
return dateTimeNow(YYYYMMDDHHMMSS);
}
public static final String dateTimeNow(final String format) {
return parseDateToStr(format, new Date());
}
public static final String dateTime(final Date date) {
return parseDateToStr(YYYY_MM_DD, date);
}
public static final String parseDateToStr(final String format, final Date date) {
return new SimpleDateFormat(format).format(date);
}
public static final Date dateTime(final String format, final String ts) {
try {
return new SimpleDateFormat(format).parse(ts);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 日期路径 即年/月/日 如2018/08/08
*/
public static final String datePath() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyy/MM/dd");
}
/**
* 日期路径 即年/月/日 如20180808
*/
public static final String dateTime() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyyMMdd");
}
/**
* 日期型字符串转化为日期 格式
*/
public static Date parseDate(Object str) {
if (str == null) {
return null;
}
try {
return parseDate(str.toString(), parsePatterns);
} catch (ParseException e) {
return null;
}
}
/**
* 获取服务器启动时间
*/
public static Date getServerStartDate() {
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(time);
}
/**
* 计算两个时间差
*/
public static String getDatePoor(Date endDate, Date nowDate) {
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
// long ns = 1000;
// 获得两个时间的毫秒时间差异
long diff = endDate.getTime() - nowDate.getTime();
// 计算差多少天
long day = diff / nd;
// 计算差多少小时
long hour = diff % nd / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
// long sec = diff % nd % nh % nm / ns;
return day + "天" + hour + "小时" + min + "分钟";
}
public static LocalDate dateLocalTransformDate(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
public static LocalDateTime localDateTimeTransformDate(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
public static Date localDateTransformDate(LocalDate localDate) {
ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
return Date.from(zonedDateTime.toInstant());
}
public static List<DateWeekModel> getDayWeek(Date scheduleDate) {
List<DateWeekModel> dateWeekModels = new ArrayList<>();
LocalDate start = dateLocalTransformDate(scheduleDate);
LocalDate end = start.with(TemporalAdjusters.lastDayOfMonth());
Stream.iterate(start, date -> date.plusDays(1))
.limit(ChronoUnit.DAYS.between(start, end) + 1)
.forEach(date -> dateWeekModels.add(DateWeekModel.builder()
.date(localDateTransformDate(date))
.week(DayWeek.valueOf(date.getDayOfWeek().toString()).getWeek())
.build()));
return dateWeekModels;
}
public static List<DateWeekModel> getDayWeekByStartAndEnd(Date startDate, Date endDate) {
List<DateWeekModel> dateWeekModels = new ArrayList<>();
LocalDate start = dateLocalTransformDate(startDate);
LocalDate end = dateLocalTransformDate(endDate);
Stream.iterate(start, date -> date.plusDays(1))
.limit(ChronoUnit.DAYS.between(start, end) + 1)
.forEach(date -> dateWeekModels.add(DateWeekModel.builder()
.date(localDateTransformDate(date))
.week(DayWeek.valueOf(date.getDayOfWeek().toString()).getWeek())
.build()));
return dateWeekModels;
}
/**
* 根据日期求出 星期
* @param date
* @return
*/
public static String getDayOfWeek(Date date) {
// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// Date date = format.parse(dateString);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
switch (dayOfWeek) {
case Calendar.SUNDAY:
return "星期日";
case Calendar.MONDAY:
return "星期一";
case Calendar.TUESDAY:
return "星期二";
case Calendar.WEDNESDAY:
return "星期三";
case Calendar.THURSDAY:
return "星期四";
case Calendar.FRIDAY:
return "星期五";
case Calendar.SATURDAY:
return "星期六";
default:
return "未知";
}
}
public static BigDecimal getHours(String startTime, String endTime, BigDecimal restHours) {
BigDecimal workHours = null;
if (startTime.equals(endTime)) {
BigDecimal total = new BigDecimal(24);
workHours = total.subtract(restHours);
} else {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
try {
Date startDate = sdf.parse(startTime);
Date endDate = sdf.parse(endTime);
BigDecimal total = new BigDecimal(endDate.getTime() - startDate.getTime()).divide(new BigDecimal(1000 * 60 * 60));
if (startDate.compareTo(endDate) > 0) {
total = total.add(new BigDecimal(24));
}
workHours = total.subtract(restHours);
} catch (ParseException e) {
e.printStackTrace();
}
}
return workHours;
}
/**
* 当前日期前移后移
*
* @param date
* @param dayNum
* @return
*/
public static Date addOrSubDate(Date date, int dayNum) {
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.add(calendar.DATE, dayNum);
date = calendar.getTime();
return date;
}
public static Date formatDate(Date date) {
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
return dateTime(YYYY_MM, parseDateToStr(YYYY_MM, calendar.getTime()));
}
/**
* 获取开始时间和结束时间差值(yyyy-MM-dd)
*
* @param beginDate
* @param endDate
* @return
*/
public static int getTimeDifference(String beginDate, String endDate) {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
Long c = null;
try {
c = sf.parse(endDate).getTime() - sf.parse(beginDate).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
int d = (int) (c / 1000 / 60 / 60 / 24) + 1;//天
return d;
}
/**
* 获取开始时间和结束时间的日差区间(yyyy-MM-dd)
*
* @param beginDate
* @param dvalue
* @param paramE 是否拼接每天对应的星期一、二、三、、、
* @return
*/
public static String[] getAllDates(String beginDate, int dvalue, boolean paramE) {
String[] allDates = new String[dvalue];
SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
try {
Date time = formatDate.parse(beginDate);
for (int i = 0; i < allDates.length; i++) {
Calendar calendar = new GregorianCalendar();
calendar.setTime(time);
calendar.add(Calendar.DATE, i);//把日期往后增加一天.整数往后推,负数往前移动
Date appendedTime = calendar.getTime();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
allDates[i] = df.format(appendedTime) + (paramE ? "," + DateUtils.formatDate(appendedTime, "E") : "");
}
} catch (Exception e) {
e.printStackTrace();
}
return allDates;
}
/**
* 得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
*/
public static String formatDate(Date date, Object... pattern) {
String formatDate = null;
if (date == null) {
date = new Date();
}
if (pattern != null && pattern.length > 0) {
formatDate = DateFormatUtils.format(date, pattern[0].toString());
} else {
formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
}
return formatDate;
}
/**
* @param pattern 可以和beginTime和endTime格式一样,如"yyyy-MM-dd","yyyy-MM"
* @title 获取两个字符串日期之间的所有月份
* @date 2017年6月14日
* @author 陈天同
*/
public static List<String> getMonths(String beginTime, String endTime, String pattern) {
List<String> months = new ArrayList<String>();
Calendar begin = Calendar.getInstance();
Calendar end = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
begin.setTime(format.parse(beginTime));
begin.set(begin.get(Calendar.YEAR), begin.get(Calendar.MONTH), 1);
end.setTime(format.parse(endTime));
end.set(end.get(Calendar.YEAR), end.get(Calendar.MONTH), 2);
Calendar current = begin;
while (current.before(end)) {
months.add(format.format(current.getTime()));
current.add(Calendar.MONTH, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
return months;
}
/**
* @title 获取两个字符串日期之间的所有年
* @date 2018年11月06日
* @param beginTime/endTime的格式是: yyyy
* @author chentiantong
*/
/**
* @param pattern 可以和beginTime和endTime格式一样,如"yyyy-MM-dd","yyyy-MM"
* @title 获取两个字符串日期之间的所有月份
* @date 2017年6月14日
* @author 陈天同
*/
public static List<Date> getDateMonths(String beginTime, String endTime, String pattern) {
Calendar begin = Calendar.getInstance();
Calendar end = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat(pattern);
List<Date> dates = new ArrayList<>();
try {
List<String> months = new ArrayList<>();
begin.setTime(format.parse(beginTime));
begin.set(begin.get(Calendar.YEAR), begin.get(Calendar.MONTH), 1);
end.setTime(format.parse(endTime));
end.set(end.get(Calendar.YEAR), end.get(Calendar.MONTH), 2);
Calendar current = begin;
while (current.before(end)) {
months.add(format.format(current.getTime()));
current.add(Calendar.MONTH, 1);
}
for (String month : months) {
Date date = format.parse(month);
dates.add(date);
}
} catch (ParseException e) {
e.printStackTrace();
}
return dates;
}
public static List<String> getYearsFromDates(String beginTime, String endTime) {
List<String> years = new ArrayList<String>();
Calendar begin = Calendar.getInstance();
Calendar end = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("yyyy");
try {
begin.setTime(format.parse(beginTime));
end.setTime(format.parse(endTime));
Calendar current = begin;
while (current.before(end)) {
years.add(format.format(current.getTime()));
current.add(Calendar.YEAR, 1);
}
years.add(format.format(format.parse(endTime)));
} catch (Exception e) {
e.printStackTrace();
}
return years;
}
/**
* 获取两个日期段中的每天日期
*
* @param startTime
* @param endTime
* @return
*/
public static List<Date> getTimeFromStartToEnd(Date startTime, Date endTime) {
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
start.setTime(startTime);
end.setTime(endTime);
return getEveryDay(start, end);
}
public static List<Date> getEveryDay(Calendar startDay, Calendar endDay) {
List<Date> list = new ArrayList<>();
if (startDay.compareTo(endDay) > 0) {
return list;
}
list.add(startDay.getTime());
if (startDay.compareTo(endDay) == 0) {
return list;
}
while (true) {
if (DateUtils.isSameDay(startDay, endDay)) {
break;
}
startDay.add(Calendar.DATE, 1);
if (DateUtils.isSameDay(startDay, endDay)) {
break;
}
list.add(startDay.getTime());
}
list.add(endDay.getTime());
return list;
}
//1:本月第一天
public static Date getMonthFirstDay(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.MONTH, 0);
c.set(Calendar.DAY_OF_MONTH, 1);
return c.getTime();
}
//1:本月最后天
public static Date getMonthLastDay(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
return c.getTime();
}
public static Boolean sameDate(Date dt1, Date dt2) {
if (dt1 == null || dt2 == null) {
return false;
}
LocalDateTime localDate1 = ZonedDateTime.ofInstant(dt1.toInstant(), ZoneId.systemDefault()).toLocalDateTime();
LocalDateTime localDate2 = ZonedDateTime.ofInstant(dt2.toInstant(), ZoneId.systemDefault()).toLocalDateTime();
return localDate1.isEqual(localDate2);
}
public static List<Date> getMonthFromDate(List<Date> dateList, SimpleDateFormat dateFormat, SimpleDateFormat monthFormat) {
List<Date> months = new ArrayList<>();
try {
for (Date date : dateList) {
String dateStr = dateFormat.format(date);
String monthStr = dateStr.substring(0, dateStr.lastIndexOf("-"));
months.add(monthFormat.parse(monthStr));
}
} catch (Exception e) {
e.printStackTrace();
}
return months;
}
public static List<Date> getDates(String startTime, String endTime) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 声明保存日期集合
List<Date> list = new ArrayList<>();
try {
// 转化成日期类型
Date startDate = sdf.parse(startTime);
Date endDate = sdf.parse(endTime);
//用Calendar 进行日期比较判断
Calendar calendar = Calendar.getInstance();
while (startDate.getTime() <= endDate.getTime()) {
// 把日期添加到集合
list.add(startDate);
// 设置日期
calendar.setTime(startDate);
//把日期增加一天
calendar.add(Calendar.DATE, 1);
// 获取增加后的日期
startDate = calendar.getTime();
}
} catch (ParseException e) {
e.printStackTrace();
}
return list;
}
/**
* 将LocalDateTime转化为Date
*
* @param localDateTime
* @return
*/
public static Date toDate(LocalDateTime localDateTime) {
if (Objects.isNull(localDateTime)) {
return null;
}
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
/**
* 将LocalDate转化为Date
*
* @param localDate
* @return
*/
public static Date toDate(LocalDate localDate) {
if (Objects.isNull(localDate)) {
return null;
}
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
return Date.from(instant);
}
/**
* 将Date转化为LocalDateTime
*
* @param date
* @return
*/
public static LocalDateTime toLocalDateTime(Date date) {
if (Objects.isNull(date)) {
return null;
}
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
}
/**
* 将Date转化为LocalDate
*
* @param date
* @return
*/
public static LocalDate toLocalDate(Date date) {
if (Objects.isNull(date)) {
return null;
}
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalDate();
}
/**
* 获取一天的开始
*
* @param date
* @return
*/
public static Date getStartOfDay(Date date) {
if (Objects.isNull(date)) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
/**
* 获取一天的结束
*
* @param date
* @return
*/
public static Date getEndOfDay(Date date) {
if (Objects.isNull(date)) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTime();
}
//获取时间差方法
public static String getTime(Date currentTime, Date firstTime) {
long diff = currentTime.getTime() - firstTime.getTime();//这样得到的差值是微秒级别
Calendar currentTimes = dataToCalendar(currentTime);//当前系统时间转Calendar类型
Calendar firstTimes = dataToCalendar(firstTime);//查询的数据时间转Calendar类型
int year = currentTimes.get(Calendar.YEAR) - firstTimes.get(Calendar.YEAR);//获取年
int month = currentTimes.get(Calendar.MONTH) - firstTimes.get(Calendar.MONTH);
int day = currentTimes.get(Calendar.DAY_OF_MONTH) - firstTimes.get(Calendar.DAY_OF_MONTH);
if (day < 0) {
month -= 1;
currentTimes.add(Calendar.MONTH, -1);
day = day + currentTimes.getActualMaximum(Calendar.DAY_OF_MONTH);//获取日
}
if (month < 0) {
month = (month + 12) % 12;//获取月
year--;
}
long days = diff / (1000 * 60 * 60 * 24);
long hours = (diff - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); //获取时
long minutes = (diff - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60); //获取分钟
long s = (diff / 1000 - days * 24 * 60 * 60 - hours * 60 * 60 - minutes * 60);//获取秒
String CountTime = "" + year + "年" + month + "月" + day + "天" + hours + "小时" + minutes + "分" + s + "秒";
return CountTime;
}
//Date类型转Calendar类型
public static Calendar dataToCalendar(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
}
/**
* 获取日期所在月的 第一天
*
* @param date
* @return
*/
public static Date getFristDayOfMonth(Date date) {
Calendar cale = Calendar.getInstance();
cale.setTime(date);
cale.add(Calendar.MONTH, 0);
cale.set(Calendar.DAY_OF_MONTH, 1);
return cale.getTime();
}
/**
* 获取日期所在月的 最后一天
*
* @param date
* @return
*/
public static Date getEndDayOfMonth(Date date) {
Calendar cale = Calendar.getInstance();
cale.setTime(date);
cale.add(Calendar.MONTH, 1);
cale.set(Calendar.DAY_OF_MONTH, 0);
return cale.getTime();
}
/**
* 将YYYY-M格式转换为YYYY-MM
*
* @param date
* @return
*/
public static String MonthFormat(String date) {
if (date != null && date.length() == 6) {
return date.substring(0, 5) + "0" + date.substring(5);
}
return date;
}
}
日期周期模型 Class DateWeekModel
package com.ruoyi.common.utils.date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Builder;
import lombok.Data;
import java.util.Date;
@Data
@Builder
public class DateWeekModel {
@JsonFormat(pattern = "yyyy-MM-dd")
Date date;
String week;
}
周期枚举类 enum DayWeek
package com.ruoyi.common.utils.date;
public enum DayWeek {
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五"),
SATURDAY("星期六"),
SUNDAY("星期日");
private String week;
DayWeek() {
}
DayWeek(String week) {
this.week = week;
}
public String getWeek() {
return week;
}
public void setWeek(String week) {
this.week = week;
}
}