java 对时间转换、时间段的截取操作轮子
直接拿到项目中稍加修改就可以用
package com.common.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class DateUtil {
public static ThreadLocal<DateFormat> chinaDateSDF = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
return df;
}
};
/**
* 获取日期yyyy-MM-dd格式字符串
*
* @param date
* @param locale
* @return
*/
public static String dateToStr(Date date, Locale locale) {
if (locale == null) {
}
return chinaDateSDF.get().format(date);
}
/**
* 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
*
* @param strDate
* @return
*/
public static Date strToDateLong(String strDate) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// ParsePosition pos = new ParsePosition(0);
Date strtodate = null;
try {
strtodate = formatter.parse(strDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return strtodate;
}
/**
* 获取昨天日期
*/
public static String getyesterday() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
return yesterday;
}
/**
* 获取本周开始时间
*/
public static String getWeekStartDate() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");// 设置日期格式
Calendar cld = Calendar.getInstance(Locale.CHINA);
cld.setFirstDayOfWeek(Calendar.MONDAY);// 以周一为首日
cld.setTimeInMillis(System.currentTimeMillis());// 当前时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);// 周一
String time = df.format(cld.getTime());
return time;
}
/**
* 获取本周结束时间
*/
public static String getWeekEndDate() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");// 设置日期格式
Calendar cld = Calendar.getInstance(Locale.CHINA);
cld.setFirstDayOfWeek(Calendar.MONDAY);// 以周一为首日
cld.setTimeInMillis(System.currentTimeMillis());// 当前时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);// 周日
String time = df.format(cld.getTime());
return time;
}
/**
* 获取上周开始时间
*/
public static String getLastWeekStartDate() {
// 随便虚拟一个日期
LocalDate now = LocalDate.now();
// 求这个日期上一周的周一、周日
LocalDate todayOfLastWeek = now.minusDays(7);
LocalDate monday = todayOfLastWeek.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)).plusDays(1);
ZoneId zone = ZoneId.systemDefault();
Instant instant = monday.atStartOfDay().atZone(zone).toInstant();
Date da = Date.from(instant);
return new SimpleDateFormat("yyyy-MM-dd").format(da);
}
/**
* 获取上周结束时间
*/
public static String getLastWeekEndDate() {
// 随便虚拟一个日期
LocalDate now = LocalDate.now();
// 求这个日期上一周的周一、周日
LocalDate todayOfLastWeek = now.minusDays(7);
LocalDate sunday = todayOfLastWeek.with(TemporalAdjusters.next(DayOfWeek.MONDAY)).minusDays(1);
ZoneId zone = ZoneId.systemDefault();
Instant instant = sunday.atStartOfDay().atZone(zone).toInstant();
Date da = Date.from(instant);
return new SimpleDateFormat("yyyy-MM-dd").format(da);
}
/**
* 获取本月第一天
*/
public static String getMonthFirstDay() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.MONTH, 0);
return new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
}
/**
* 获取本月最后一天
*/
public static String getMonthLastDay() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
}
/**
* 获取前一个月第一天
*/
public static String getBeforeMonthFirstDay() {
// 获取时间工具对象
Calendar calendar = Calendar.getInstance();
// 设置前一个月
calendar.add(Calendar.MONTH, -1);
// 设置开始时间是00:00:00
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
// 获取这个月最小的一天
int minimum = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
// 放进对象
calendar.set(Calendar.DAY_OF_MONTH, minimum);
Date time = calendar.getTime();
// 指定格式输出
return new SimpleDateFormat("yyyy-MM-dd").format(time);
}
/**
* 获取前一个月最后一天
*/
public static String getBeforeMonthLastDay() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, -1);
// 获取当前月最大的一天
int maximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, maximum);
// 设置最一天的结束时间是23:59:59
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
return new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
}
/**
* @Description 根据当前日期获取本季度第一天
* @Return java.util.Date
**/
public static String getCurrentQuarterStartTime() {
Calendar c = Calendar.getInstance();
int currentMonth = c.get(Calendar.MONTH) + 1;
SimpleDateFormat longSdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat shortSdf = new SimpleDateFormat("yyyy-MM-dd");
Date now = null;
try {
if (currentMonth <= 3)
c.set(Calendar.MONTH, 0);
else if (currentMonth <= 6)
c.set(Calendar.MONTH, 3);
else if (currentMonth <= 9)
c.set(Calendar.MONTH, 6);
else if (currentMonth <= 12)
c.set(Calendar.MONTH, 9);
c.set(Calendar.DATE, 1);
now = longSdf.parse(shortSdf.format(c.getTime()));
return new SimpleDateFormat("yyyy-MM-dd").format(now);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* @Description 根据当前日期获取本季度最后一天
* @Return java.util.Date
**/
public static String getCurrentQuarterEndTime() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat shortSdf = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
date = shortSdf.parse(getCurrentQuarterStartTime());
cal.setTime(date);
cal.add(Calendar.MONTH, 2);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
}
/**
* 获取当前日期上一季度 开始时间
*
* @return
*/
public static String getStartQuarter() {
Calendar startCalendar = Calendar.getInstance();
startCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3 - 1) * 3);
startCalendar.set(Calendar.DAY_OF_MONTH, 1);
setMinTime(startCalendar);
return new SimpleDateFormat("yyyy-MM-dd").format(startCalendar.getTime());
}
/**
* 获取当前日期上一季度 结束时间
*
* @return
*/
public static String getLastQuarter() {
Calendar endCalendar = Calendar.getInstance();
endCalendar.set(Calendar.MONTH, ((int) endCalendar.get(Calendar.MONTH) / 3 - 1) * 3 + 2);
endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
setMaxTime(endCalendar);
return new SimpleDateFormat("yyyy-MM-dd").format(endCalendar.getTime());
}
/**
* 最小时间
*
* @param calendar
*/
private static void setMinTime(Calendar calendar) {
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
}
/**
* 最大时间
*
* @param calendar
*/
private static void setMaxTime(Calendar calendar) {
calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
calendar.set(Calendar.MILLISECOND, calendar.getActualMaximum(Calendar.MILLISECOND));
}
/**
* 获取本年的第一天
*
* @return String
**/
public static String getYearStart() {
return new SimpleDateFormat("yyyy").format(new Date()) + "-01-01";
}
/**
* 获取本年的最后一天
*
* @return String
**/
public static String getYearEnd() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, calendar.getActualMaximum(Calendar.MONTH));
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
Date currYearLast = calendar.getTime();
return new SimpleDateFormat("yyyy-MM-dd").format(currYearLast);
}
/**
* 去年 第一天
*/
public static String getYearBefore() {
SimpleDateFormat formats = new SimpleDateFormat("yyyy");
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, -1);
Date date = c.getTime();
return formats.format(date) + "-01-01";
}
/**
* 去年最后一天
*/
public static String getYearAfter() {
SimpleDateFormat formats = new SimpleDateFormat("yyyy");
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, -1);
Date date = c.getTime();
return formats.format(date) + "-12-31";
}
public static Map<String, String> checkSelectTime(String countValue) {
String beginTime = "";
String endTime = "";
Map<String, String> map = new HashMap<String, String>();
switch (countValue) {
case "1":// 今日
beginTime = new SimpleDateFormat("yyyy-MM").format(new Date());
endTime = new SimpleDateFormat("yyyy-MM").format(new Date());
break;
case "2":// 昨日
beginTime = DateUtil.getyesterday().toString();
endTime = DateUtil.getyesterday().toString();
break;
case "3":// 本周
beginTime = DateUtil.getWeekStartDate().toString();
endTime = DateUtil.getWeekEndDate().toString();
break;
case "4":// 上周
beginTime = DateUtil.getLastWeekStartDate().toString();
endTime = DateUtil.getLastWeekEndDate().toString();
break;
case "5":// 本月
beginTime = DateUtil.getMonthFirstDay().toString();
endTime = DateUtil.getMonthLastDay().toString();
break;
case "6":// 上月
beginTime = DateUtil.getBeforeMonthFirstDay().toString();
endTime = DateUtil.getBeforeMonthLastDay().toString();
break;
case "7":// 本季度
beginTime = DateUtil.getCurrentQuarterStartTime().toString();
endTime = DateUtil.getCurrentQuarterEndTime().toString();
break;
case "8":// 上季度
beginTime = DateUtil.getStartQuarter().toString();
endTime = DateUtil.getLastQuarter().toString();
break;
case "9":// 本年
beginTime = DateUtil.getYearStart().toString();
endTime = DateUtil.getYearEnd().toString();
break;
case "10":// 去年
beginTime = DateUtil.getYearBefore().toString();
endTime = DateUtil.getYearAfter().toString();
break;
default:
beginTime = new SimpleDateFormat("yyyy-MM").format(new Date()).toString();
endTime = new SimpleDateFormat("yyyy-MM").format(new Date()).toString();
break;
}
map.put("beginTime", beginTime);
map.put("endTime", endTime);
return map;
}
/**
* 计算两个日期间所有月份 传值Date
* */
public static List<String> getBetweenMonths(Date start, Date end) {
List<String> result = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
// 加了一个月
tempStart.add(Calendar.MONTH, 1);
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
result.add(sdf.format(start));
while (tempStart.before(tempEnd)) {
result.add(sdf.format(tempStart.getTime()));
tempStart.add(Calendar.MONTH, 1);
}
return result;
}
/**
* 计算两个日期间所有月份 传值字符串
* */
public static List<String> getMonthBetweenDate(String startTime, String endTime){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
// 声明保存日期集合
List<String> list = new ArrayList<String>();
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) {
e.printStackTrace();
}
return list;
}
public static void main(String[] args) {
System.out.println(getMonthBetweenDate("2021-02-02","2022-04-06"));
}
}