下面的例子是一个完整的工具类,记录了各种获取开始时间和结束时间的方法,其中本人用过的个别方法为开始时间和结束时间格式为 2019-10-10 00:00:00 ,2019-10-10 23:59:59,最下方有测试类,可以先执行一下,根据自己的需要去修改
package cn.shangze.gf.common.utils;
import lombok.extern.slf4j.Slf4j;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 时间计算工具类
*/
@Slf4j
public class TimeCalculationUtil {
private static final SimpleDateFormat shortSdf = new SimpleDateFormat("yyyy-MM-dd");
private static final SimpleDateFormat longHourSdf = new SimpleDateFormat("yyyy-MM-dd HH");
private static final SimpleDateFormat longSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 计算2个日期之间相差的天数
* 比如:2011-02-02 到 2017-03-02 以日为单位相差为:2220天
* @param StartDate 开始时间
* @param endDate 结束时间
* @return
*/
public static int dayCompare(String StartDate, String endDate){
Calendar startCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();
try {
startCalendar.setTime(longSdf.parse(StartDate));
endCalendar.setTime(longSdf.parse(endDate));
} catch (ParseException e) {
e.printStackTrace();
}
int day = (int) ((endCalendar.getTimeInMillis() - startCalendar.getTimeInMillis()) / (24 * 3600 * 1000));
System.out.println(day);
return day;
}
/***************************** 根据年份和月份获取当月开始时间结束时间 **************************************/
public static Date getBeginTime(int year, int month) {
YearMonth yearMonth = YearMonth.of(year, month);
LocalDate localDate = yearMonth.atDay(1);
LocalDateTime startOfDay = localDate.atStartOfDay();
ZonedDateTime zonedDateTime = startOfDay.atZone(ZoneId.of("Asia/Shanghai"));
return Date.from(zonedDateTime.toInstant());
}
public static Date getEndTime(int year, int month) {
YearMonth yearMonth = YearMonth.of(year, month);
LocalDate endOfMonth = yearMonth.atEndOfMonth();
LocalDateTime localDateTime = endOfMonth.atTime(23, 59, 59, 999);
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
return Date.from(zonedDateTime.toInstant());
}
/***************************** 判断当前时间是否在[startTime, endTime]区间 **************************************/
/**
* 判断当前时间是否在[startTime, endTime]区间(包含startTime和endTime),注意时间格式要一致
* @param nowTime 当前时间
* @param startTime 开始时间
* @param endTime 结束时间
* @return
* @author jqlin
*/
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime()|| nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
/***************************** 获取服务器当前年份/月份 **************************************/
// 获取今年是哪一年
public static Integer getNowYear() {
Date date = new Date();
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
return Integer.valueOf(gc.get(1));
}
// 获取本月是哪一月
public static int getNowMonth() {
Date date = new Date();
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
return gc.get(2) + 1;
}
/***************************** 获得本周、本季等开始、结束时间的方法 **************************************/
// 获得当天0点时间
public static Date getTimesmorning() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
// 获得昨天0点时间
public static Date getYesterdaymorning() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(getTimesmorning().getTime()-3600*24*1000);
return cal.getTime();
}
// 获得当天近7天时间
public static Date getWeekFromNow() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis( getTimesmorning().getTime()-3600*24*1000*7);
return cal.getTime();
}
// 获得当天24点时间
public static Date getTimesnight() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 24);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
// 获得本周一0点时间
public static Date getTimesWeekmorning() {
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
return cal.getTime();
}
// 获得本周日23点时间
public static Date getTimesWeeknight() {
Calendar cal = Calendar.getInstance();
cal.setTime(getTimesWeekmorning());
cal.add(Calendar.DAY_OF_WEEK, 6);
try {
cal.setTime(longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59"));
} catch (ParseException e) {
e.printStackTrace();
}
return cal.getTime();
}
// 获得本月第一天0点时间
public static Date getTimesMonthmorning() {
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
return cal.getTime();
}
// 获得本月最后一天23点时间
public static Date getTimesMonthnight() {
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, 23);
try {
cal.setTime(longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59"));
} catch (ParseException e) {
e.printStackTrace();
}
return cal.getTime();
}
//获得本季度开始点时间
public static Date getCurrentQuarterStartTime() {
Calendar cal = Calendar.getInstance();
int currentMonth = cal.get(Calendar.MONTH) + 1;
Date now = null;
try {
if (currentMonth >= 1 && currentMonth <= 3)
cal.set(Calendar.MONTH, 0);
else if (currentMonth >= 4 && currentMonth <= 6)
cal.set(Calendar.MONTH, 3);
else if (currentMonth >= 7 && currentMonth <= 9)
cal.set(Calendar.MONTH, 4);
else if (currentMonth >= 10 && currentMonth <= 12)
cal.set(Calendar.MONTH, 9);
cal.set(Calendar.DATE, 1);
now = longSdf.parse(shortSdf.format(cal.getTime()) + " 00:00:00");
} catch (Exception e) {
e.printStackTrace();
}
return now;
}
/**
* 当前季度的结束时间,即2012-03-31 23:59:59
* @return
*/
public static Date getCurrentQuarterEndTime() {
Calendar cal = Calendar.getInstance();
int currentMonth = cal.get(Calendar.MONTH) + 1;
Date now = null;
try {
if (currentMonth >= 1 && currentMonth <= 3) {
cal.set(Calendar.MONTH, 2);
cal.set(Calendar.DATE, 31);
} else if (currentMonth >= 4 && currentMonth <= 6) {
cal.set(Calendar.MONTH, 5);
cal.set(Calendar.DATE, 30);
} else if (currentMonth >= 7 && currentMonth <= 9) {
cal.set(Calendar.MONTH, 8);
cal.set(Calendar.DATE, 30);
} else if (currentMonth >= 10 && currentMonth <= 12) {
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DATE, 31);
}
now = longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59");
} catch (Exception e) {
e.printStackTrace();
}
return now;
}
//获得本年开始点时间
public static Date getCurrentYearStartTime() {
Calendar cal = Calendar.getInstance();
Date now = null;
try {
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DATE, 1);
now = shortSdf.parse(shortSdf.format(cal.getTime()));
} catch (Exception e) {
e.printStackTrace();
}
return now;
}
//本年的结束时间,即2012-03-31 23:59:59
public static Date getCurrentYearEndTime() {
Calendar cal = Calendar.getInstance();
Date now = null;
try {
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DATE, 31);
now = longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59");
} catch (Exception e) {
e.printStackTrace();
}
return now;
}
/**
* 获取前/后半年的开始时间
*
* @return
*/
public static Date getHalfYearStartTime() {
Calendar cal = Calendar.getInstance();
int currentMonth = cal.get(Calendar.MONTH) + 1;
Date now = null;
try {
if (currentMonth >= 1 && currentMonth <= 6) {
cal.set(Calendar.MONTH, 0);
} else if (currentMonth >= 7 && currentMonth <= 12) {
cal.set(Calendar.MONTH, 6);
}
cal.set(Calendar.DATE, 1);
now = longSdf.parse(shortSdf.format(cal.getTime()) + " 00:00:00");
} catch (Exception e) {
e.printStackTrace();
}
return now;
}
/**
* 获取前/后半年的结束时间
*
* @return
*/
public static Date getHalfYearEndTime() {
Calendar cal = Calendar.getInstance();
int currentMonth = cal.get(Calendar.MONTH) + 1;
Date now = null;
try {
if (currentMonth >= 1 && currentMonth <= 6) {
cal.set(Calendar.MONTH, 5);
cal.set(Calendar.DATE, 30);
} else if (currentMonth >= 7 && currentMonth <= 12) {
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DATE, 31);
}
now = longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59");
} catch (Exception e) {
e.printStackTrace();
}
return now;
}
/***************************** 获取上周、上月、上季度、当前半年的上一个半年、上年的开始结束时间 **************************************/
//获得上年开始点时间
public static Date getLastYearStartTime() {
Calendar cal = Calendar.getInstance();
cal.setTime(getCurrentYearStartTime());
cal.add(Calendar.YEAR, -1);
return cal.getTime();
}
//获得上年开始点时间
public static Date getLastYearEndTime() {
Calendar cal = Calendar.getInstance();
cal.setTime(getCurrentYearEndTime());
cal.add(Calendar.YEAR, -1);
return cal.getTime();
}
//获得当前半年的上半年开始点时间
public static Date getLastHalfYearStart() {
Calendar cal = Calendar.getInstance();
//cal.set(2019, 5, 6); 测试用虚拟时间
cal.set(Calendar.MONTH, ((int) cal.get(Calendar.MONTH) / 6 - 1) * 6);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return new Timestamp(cal.getTimeInMillis());
}
//获得当前半年的上半年结束点时间
public static Date getLastHalfYearEnd() {
Calendar cal = Calendar.getInstance();
//cal.set(2019, 5, 6); 测试用虚拟时间
cal.set(Calendar.MONTH, ((int) cal.get(Calendar.MONTH) / 6 - 1) * 6 + 5);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
return new Timestamp(cal.getTimeInMillis());
}
//获得上季度开始点时间
public static Date getLastQuarterStart() {
Calendar cal = Calendar.getInstance();
//cal.set(2019, 5, 6); //测试用虚拟时间
cal.set(Calendar.MONTH, ((int) cal.get(Calendar.MONTH) / 3 - 1) * 3);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return new Timestamp(cal.getTimeInMillis());
}
//获得上季度结束点时间
public static Date getLastQuarterEnd() {
Calendar cal = Calendar.getInstance();
//cal.set(2019, 5, 6); //测试用虚拟时间
cal.set(Calendar.MONTH, ((int) cal.get(Calendar.MONTH) / 3 - 1) * 3 + 2);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
return new Timestamp(cal.getTimeInMillis());
}
// 获取上月的开始时间
public static Date getBeginDayOfLastMonth() {
Calendar calendar = Calendar.getInstance();
calendar.set(getNowYear(), getNowMonth() - 2, 1);
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
calendar.set(Calendar.MILLISECOND, 0);
return new Timestamp(calendar.getTimeInMillis());
}
// 获取上月的结束时间
public static Date getEndDayOfLastMonth() {
Calendar calendar = Calendar.getInstance();
calendar.set(getNowYear(), getNowMonth() - 2, 1);
int day = calendar.getActualMaximum(5);
calendar.set(getNowYear(), getNowMonth() - 2, day);
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
calendar.set(Calendar.MILLISECOND, 999);
return new Timestamp(calendar.getTimeInMillis());
}
// 获取上周的开始时间
public static Date getBeginDayOfLastWeek() {
Date date = new Date();
if (date == null) {
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
if (dayofweek == 1) {
dayofweek += 7;
}
cal.add(Calendar.DATE, 2 - dayofweek - 7);
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
return new Timestamp(cal.getTimeInMillis());
}
// 获取上周的结束时间
public static Date getEndDayOfLastWeek() {
Calendar cal = Calendar.getInstance();
cal.setTime(getBeginDayOfLastWeek());
cal.add(Calendar.DAY_OF_WEEK, 6);
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
cal.set(Calendar.MILLISECOND, 999);
return new Timestamp(cal.getTimeInMillis());
}
//计算2个日期之间相差的天数main方法
/*public static void main(String[] args) {
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
try {
dayCompare(format1.parse("2018-10-14"),new Date());
} catch (ParseException e) {
e.printStackTrace();
}
}*/
//计算本周、本季等开始结束时间的main方法
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// TODO Auto-generated method stub
System.out.println("当天24点时间:" + sdf.format(getTimesnight()));
System.out.println("当前时间:" + new Date().toLocaleString());
System.out.println("当天0点时间:" + getTimesmorning().toLocaleString());
System.out.println("昨天0点时间:" + getYesterdaymorning().toLocaleString());
System.out.println("近7天时间:" + getWeekFromNow().toLocaleString());
System.out.println("本周周一0点时间:" + getTimesWeekmorning().toLocaleString());
System.out.println("本周周日23点时间:" + getTimesWeeknight().toLocaleString());
System.out.println("本月初0点时间:" + getTimesMonthmorning().toLocaleString());
System.out.println("本月未23点时间:" + getTimesMonthnight().toLocaleString());
System.out.println("上月初0点时间:" + getLastMonthStartMorning().toLocaleString());
System.out.println("本季度开始点时间:" + getCurrentQuarterStartTime().toLocaleString());
System.out.println("本季度结束点时间:" + getCurrentQuarterEndTime().toLocaleString());
System.out.println("本年开始点时间:" + getCurrentYearStartTime().toLocaleString());
System.out.println("本年结束点时间:" + getCurrentYearEndTime().toLocaleString());
System.out.println("上年开始点时间:" + getLastYearStartTime().toLocaleString());
System.out.println("前/后半年开始时间:" + getHalfYearStartTime().toLocaleString());
System.out.println("前/后半年结束时间:" + getHalfYearEndTime().toLocaleString());
System.out.println("***************************当前时间上一个时间******************************");
System.out.println("上年开始时间:" +TimeCalculationUtil.getLastYearStartTime().toLocaleString());
System.out.println("上年结束时间:" +TimeCalculationUtil.getLastYearEndTime().toLocaleString());
System.out.println("当前半年的上个半年开始时间:" + TimeCalculationUtil.getLastHalfYearStart().toLocaleString());
System.out.println("当前半年的上个半年结束时间:" + TimeCalculationUtil.getLastHalfYearEnd().toLocaleString());
System.out.println("上季度开始时间:" +TimeCalculationUtil.getLastQuarterStart().toLocaleString());
System.out.println("上季度结束时间:" +TimeCalculationUtil.getLastQuarterEnd().toLocaleString());
System.out.println("上月开始时间:" +TimeCalculationUtil.getBeginDayOfLastMonth().toLocaleString());
System.out.println("上月结束时间:" +TimeCalculationUtil.getEndDayOfLastMonth().toLocaleString());
System.out.println("上周开始时间:" +TimeCalculationUtil.getBeginDayOfLastWeek().toLocaleString());
System.out.println("上周结束时间:" +TimeCalculationUtil.getEndDayOfLastWeek().toLocaleString());
}
}