#### 一、LocalDateTime 使用
“`
// 获得某天最大时间 2020-02-19 23:59:59
public static Date getEndOfDay(Date date) {
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
}
// 获得某天最小时间 2020-02-17 00:00:00
public static Date getStartOfDay(Date date) {
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);
return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
}
// 获得某月的第一天和最后1天,需要改造,入参传 月就行。
public static void getStartAndEndOfDay() {
LocalDateTime date1 = LocalDateTime.now();
LocalDateTime firstday = date1.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime lastDay = date1.with(TemporalAdjusters.lastDayOfMonth());
System.out.println(“firstday:” + firstday);
System.out.println(“lastDay:” + lastDay);
}
“`
#### 二、hutool DateUtil使用
“`
cn.hutool.core.date.DateUtil;
DateUtil.beginOfMonth()
DateUtil.endOfMonth()
“`
/**
* 获取两个日期之间的所有月份 (年月)
* https://blog.csdn.net/Czh3616x/article/details/127648376
* 还有
* 输入开始时间和结束时间,返回时间范围内中的所有日期列表
* 输入开始时间和结束时间,返回时间范围内中的所有年份列表
* @param startTime
* @param endTime
* @return:list
*/
public static List getMonthBetweenDate(String startTime, String endTime){
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM”);
// 声明保存日期集合
List 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(sdf.format(startDate));
// 设置日期
calendar.setTime(startDate);
//把日期增加一天
calendar.add(Calendar.MONTH, 1);
// 获取增加后的日期
startDate=calendar.getTime();
}
} catch (ParseException e) {
log.error(“获取日期间隔失败,startTime:{},endTime:{},异常:{}”, startTime, endTime, e);
}
return list;
}
public static void main(String[] args) throws ParseException {
String startStr = “2021-02”;
String endStr = “2022-03”;
List list = getMonthBetweenDate(startStr, endStr);
System.out.println(list);
}
2021-02, 2021-03, 2021-04, 2021-05, 2021-06, 2021-07, 2021-08, 2021-09, 2021-10, 2021-11, 2021-12, 2022-01, 2022-02, 2022-03]
import cn.hutool.core.date.DateUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
//转成月度
public static String convert2Month(String dateTime) {
int length = dateTime.length();
if (length < 7) {
throw new BizzException(“dateTime参数非yyyy-MM或yyyy-MM-dd HH:mm:ss格式”);
}
if (dateTime.length() > 7) {
return DateUtil.format(strToDate(dateTime), “yyyy-MM”);
}
return dateTime;
}
//转成日
public static String convert2Day(String dateTime) {
int length = dateTime.length();
if (length < 10) {
throw new BizzException(“dateTime参数非yyyy-MM-dd或yyyy-MM-dd HH:mm:ss格式”);
}
dateTime = DateFormatUtilNew.FormatDate(dateTime);
if (dateTime.length() > 10) {
return DateUtil.format(strToDate(dateTime), “yyyy-MM-dd”);
}
return dateTime;
}
/**
* 字符串转换成日期
*
* @param str
* @return date
*/
public static Date strToDate(String str) {
//DateFormatUtil 云笔记中的已经有的解析各种日期的工具
str = DateFormatUtil.FormatDate(str);
SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
Date date = null;
try {
date = format.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
获取当前季度的最后时间 到 秒
public static String getCurrentQuarterEndDateTme() {
//当天
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
String endQuarterDay = sdf.format(getQuarterEnd(new Date()).getTime());
return endQuarterDay + ” 23:59:59″;
}
/**
* https://blog.csdn.net/qq_14994863/article/details/120909628 2种方法
*
* @Description: 获取季度第一天【日期】
* 1.根据给定日期计算当前季度的第一个月份
* 2.设置日历的月份为当前季度的第一个月份
* 3.最后设置日历月份天数为第一天即可
* 用法见getCurrentQuarterEndDateTme()
**/
public static Calendar getQuarterStart(Date date) {
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(date);
//get方法:获取给定日历属性的值,如 endCalendar.get(Calendar.MONTH) 获取日历的月份
//计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第一个月份只需 月份 / 3 * 3
startCalendar.set(Calendar.MONTH, (((int) startCalendar.get(Calendar.MONTH)) / 3) * 3);
startCalendar.set(Calendar.DAY_OF_MONTH, 1);
return startCalendar;
}
/**
* @Description: 获取季度最后一天【日期】
* 用法见getCurrentQuarterEndDateTme()
**/
public static Calendar getQuarterEnd(Date date) { // 季度结束
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(date);
//计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第三个月份只需 月份 / 3 * 3 + 2
endCalendar.set(Calendar.MONTH, (((int) endCalendar.get(Calendar.MONTH)) / 3) * 3 + 2);
endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return endCalendar;
}
/**
* https://blog.csdn.net/qq_23412557/article/details/123016739
* 字符串的日期格式的计算
* 时间会通过yyyy-MM-dd转成当天的0点
* 入参支持 “2012-09-08 10:10:10″,”2012-09-15”
* 日期如果填反了,会返回负值
*/
public static int daysBetween(String smallDate, String bigDate) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(smallDate));
long time1 = cal.getTimeInMillis();
cal.setTime(sdf.parse(bigDate));
long time2 = cal.getTimeInMillis();
long between_days = (time2 – time1) / (1000 * 3600 * 24);
return Integer.parseInt(String.valueOf(between_days));
}
#### 三、joda.time使用
“`
package com.air.tqb.common;
import org.joda.time.DateTime;
import org.joda.time.Minutes;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.util.Date;
/**
* @Title: DateUtil.java
* @Description: f6汽车科技的日期时间处理工具类
* @date 2015年5月7日 下午7:03:05
*/
public class DateTimeUtil {
/**
* @return String
* @Title: addMonths
* @Description: 通过当前时间及有效期计算截止日期, 日期加月
* @author Alex
* @date 2015年4月23日上午10:57:03
*/
public static String addMonths(Date date, Integer validate) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.plusMonths(validate);
return dateTime.toString(AppConstant.DEFAULT_DATE_FORMAT_PATTERN);
}
/**
* 日期加天数
*
* @return
* @author jermmy
* 2015年5月7日19:09:59
*/
public static String addDays(Date date, Integer validate) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.plusDays(validate);
return dateTime.toString(“MM-dd”);
}
public static Date addDateDays(Date date, Long day) {
long time = date.getTime(); // 得到指定日期的毫秒数
day = day * 24 * 60 * 60 * 1000; // 要加上的天数转换成毫秒数
time += day; // 相加得到新的毫秒数
return new Date(time); // 将毫秒数转换成日期
}
/**
* 获取日期的月和日字符串
*
* @return
*/
public static String getDateSubString(Date date) {
DateTime dateTime = new DateTime(date);
return dateTime.toString(“MM-dd”);
}
/**
* @return String
* @Title: addHours
* @Description: 日期加小时, 保留时分秒
* @author Alex
* @date 2015年7月7日下午2:01:27
*/
public static String addHours(Date date, Integer validate) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.plusHours(validate);
return dateTime.toString(AppConstant.DEFAULT_DATE_FORMAT_PATTERN);
}
/**
* @return String
* @Title: addHour
* @Description: 日期加小时, 保留时分
* @author Alex
* @date 2015年7月7日下午2:02:09
*/
public static String addHour(Date date, Integer validate) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.plusHours(validate);
return dateTime.toString(“yyyy-MM-dd HH:mm”);
}
/**
* @return String
* @Title: addDay
* @Description: 日期加天数, 格式化为年月日
* @author Alex
* @date 2015年7月14日下午1:35:07
*/
public static String addDay(Date date, Integer validate) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.plusDays(validate);
return dateTime.toString(AppConstant.DEFAULT_DAY_FORMAT_PATTERN);
}
/**
* @param date
* @param validate
* @return
* @Description: 日期减天数, 格式化为年月日
*/
public static String minusDays(Date date, Integer validate) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.minusDays(validate);
return dateTime.toString(AppConstant.DEFAULT_DAY_FORMAT_PATTERN);
}
/**
* @return String
* @Title: addDay
* @Description: 日期加天数, 格式化为年月日
* @author Alex
* @date 2015年7月14日下午1:35:07
*/
public static String addMonth(Date date, Integer validate) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.plusMonths(validate);
return dateTime.toString(AppConstant.DEFAULT_DAY_FORMAT_PATTERN);
}
public static String minusDay(Date date, Integer validate) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.minusDays(validate);
return dateTime.toString(AppConstant.DEFAULT_DAY_FORMAT_PATTERN);
}
/**
* 日期+分钟
*
* @param date
* @param validate
* @return
*/
public static String addMinute(Date date, Integer validate) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.plusMinutes(validate);
return dateTime.toString(“yyyy-MM-dd HH:mm”);
}
/**
* 比较2个日期相差分钟数
*
* @param date1
* @param date2
* @return
*/
public static long getMinute(Date date1, Date date2) {
DateTime dateTime1 = new DateTime(date1);
DateTime dateTime2 = new DateTime(date2);
return Minutes.minutesBetween(dateTime2, dateTime1).getMinutes();
}
/**
* 日期+分钟
*
* @param date
* @param validate
* @return
*/
public static String addMinute(Date date, Integer validate, String fmt) {
DateTime dateTime = new DateTime(date);
dateTime = dateTime.plusMinutes(validate);
return dateTime.toString(fmt);
}
public static String getCurrentMonthStartTime() {
return new DateTime().dayOfMonth().withMinimumValue().hourOfDay().withMinimumValue().millisOfDay().withMinimumValue().toString(AppConstant.DEFAULT_DATE_FORMAT_PATTERN);
}
public static String getCurrentMonthEndTime() {
return new DateTime().dayOfMonth().withMaximumValue().hourOfDay().withMaximumValue().millisOfDay().withMaximumValue().toString(AppConstant.DEFAULT_DATE_FORMAT_PATTERN);
}
/**
* 比较日期的大小
*
* @param dateStr1
* @param dateStr2
*/
public static boolean compareDate(Date dateStr1, Date dateStr2) {
DateTime dateTime1 = new DateTime(dateStr1);
DateTime dateTime2 = new DateTime(dateStr2);
return dateTime1.isAfter(dateTime2);
}
/**
* String 转 Date
*/
public static Date transformStringToDate(String dateStr, String formatStr) {
DateTimeFormatter format = DateTimeFormat.forPattern(formatStr);
DateTime dateTime = DateTime.parse(dateStr, format);
return dateTime.toDate();
}
/**
* 计算两个date的天数差
*/
public static long getBetweenDays(Date startDate, Date endDate) {
long betweenDays = (startDate.getTime() – endDate.getTime())/(1000*60*60*24);
return betweenDays;
}
public static void main(String[] args) {
String time = DateTimeUtil.addMinute(new Date(), 30);
System.out.println(DateTimeUtil.getMinute(new Date(), new Date(0)));
System.out.println(time);
System.out.println(getCurrentMonthStartTime());
System.out.println(getCurrentMonthEndTime());
}
}
“`
### 另外见《Java-DateFormatUtil-日期格式化-将任意时间格式转为标准时间格式-字符串转Date-SimpleDateFormat》
“`
//秒转成时分秒显示-秒数格式化
private final static BigInteger bigInt3600 = new BigInteger(“3600”);
private final static BigInteger bigInt60 = new BigInteger(“60”);
//对秒时间 + 1 操作,优化展示
private static String second2Time(BigInteger second) {
if (second == null || second.compareTo(new BigInteger(“0”))<=0) {
return “00:00”;
}
long h = second.divide(bigInt3600).longValue();
long m = (second.mod(bigInt3600)).divide(bigInt60).longValue();
long s = second.mod(bigInt60).longValue();
//如果展示到时分,对秒时间 + 1 操作,优化展示
//如果展示到时分秒,这算逻辑就要去掉,并且上面判空的返回值改成return “00:00:00”;
if (s > 0) {//超过1秒,分钟+1
m += 1;
if (m >= 60) {
h += 1;
m = 0;
}
}
String str = “”;
str = (h < 10 ? ("0" + h) : h) + ":";
str += (m < 10 ? ("0" + m) : m); //+ ":";
// str += (s < 10 ? ("0" + s) : s);
return str;
}
/**
* 计算任务消费的时间
* @param startTime
* @return
*/
public static String getCostTimeString(long startTime) {
long endTime = System.currentTimeMillis();
long ms = endTime – startTime;
long hour = ms / 1000 / 60 / 60;
long min = ms / 1000 / 60 % 60;
long sec = ms / 1000 % 60;
long mi = ms % 1000;
return hour + “时” + min + “分” + sec + “秒” + mi + “毫秒”;
}
“`
– 个人网站:[http://www.jiangjiesheng.cn](http://www.jiangjiesheng.cn “个人网站,微信技术交流:yanfahezuo”)
– 微信技术交流:yanfahezuo