2023-11-07 09:32:12 +08:00
|
|
|
|
package com.zcloud.util;
|
|
|
|
|
|
|
|
|
|
import java.text.DateFormat;
|
|
|
|
|
import java.text.ParseException;
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Calendar;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 说明:日期处理
|
|
|
|
|
* 作者:luoxiaobao
|
|
|
|
|
* 官网:www.qdkjchina.com
|
|
|
|
|
*/
|
|
|
|
|
public class DateUtil {
|
|
|
|
|
|
|
|
|
|
private final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
|
|
|
|
|
private final static SimpleDateFormat sdfMonth = new SimpleDateFormat("MM");
|
|
|
|
|
private final static SimpleDateFormat sdfOnlyDay = new SimpleDateFormat("dd");
|
|
|
|
|
private final static SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
private final static SimpleDateFormat sdfMDay = new SimpleDateFormat("yyyy-M-d");
|
|
|
|
|
private final static SimpleDateFormat sdfDays = new SimpleDateFormat("yyyyMMdd");
|
|
|
|
|
private final static SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
private final static SimpleDateFormat sdfTimes = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取YYYY格式
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getSdfTimes() {
|
|
|
|
|
return sdfTimes.format(new Date());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取YYYY格式
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getYear() {
|
|
|
|
|
return sdfYear.format(new Date());
|
|
|
|
|
}
|
|
|
|
|
public static String getMonth() {
|
|
|
|
|
return sdfMonth.format(new Date());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取DD格式
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getOnlyDay() {
|
|
|
|
|
return sdfOnlyDay.format(new Date());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取YYYY-MM-DD格式
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getDay() {
|
|
|
|
|
return sdfDay.format(new Date());
|
|
|
|
|
}
|
|
|
|
|
public static String MDay() {
|
|
|
|
|
return sdfMDay.format(new Date());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取YYYYMMDD格式
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getDays(){
|
|
|
|
|
return sdfDays.format(new Date());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取YYYY-MM-DD HH:mm:ss格式
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getTime() {
|
|
|
|
|
return sdfTime.format(new Date());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Title: compareDate
|
|
|
|
|
* @Description: TODO(日期比较,如果s>=e 返回true 否则返回false)
|
|
|
|
|
* @param s
|
|
|
|
|
* @param e
|
|
|
|
|
* @return boolean
|
|
|
|
|
* @throws
|
|
|
|
|
* @author fh
|
|
|
|
|
*/
|
|
|
|
|
public static boolean compareDate(String s, String e) {
|
|
|
|
|
if(fomatDate(s)==null||fomatDate(e)==null){
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return fomatDate(s).getTime() >=fomatDate(e).getTime();
|
|
|
|
|
}
|
|
|
|
|
public static boolean compareDate2(String s, String e) {
|
|
|
|
|
if(fomatDate(s)==null||fomatDate(e)==null){
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return fomatDate(s).getTime() >fomatDate(e).getTime();
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 格式化日期
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static Date fomatDate(String date) {
|
|
|
|
|
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
try {
|
|
|
|
|
return fmt.parse(date);
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 格式化日期
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static Date fomatDateTime(String date) {
|
|
|
|
|
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
try {
|
|
|
|
|
return fmt.parse(date);
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 校验日期是否合法
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static boolean isValidDate(String s) {
|
|
|
|
|
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
try {
|
|
|
|
|
fmt.parse(s);
|
|
|
|
|
return true;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
return false; // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param startTime
|
|
|
|
|
* @param endTime
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static int getDiffYear(String startTime,String endTime) {
|
|
|
|
|
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
try {
|
|
|
|
|
int years=(int) (((fmt.parse(endTime).getTime()-fmt.parse(startTime).getTime())/ (1000 * 60 * 60 * 24))/365);
|
|
|
|
|
return years;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
return 0; // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* <li>功能描述:时间相减得到天数
|
|
|
|
|
* @param beginDateStr
|
|
|
|
|
* @param endDateStr
|
|
|
|
|
* @return
|
|
|
|
|
* long
|
|
|
|
|
* @author Administrator
|
|
|
|
|
*/
|
|
|
|
|
public static long getDaySub(String beginDateStr,String endDateStr){
|
|
|
|
|
long day=0;
|
|
|
|
|
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
java.util.Date beginDate = null;
|
|
|
|
|
java.util.Date endDate = null;
|
|
|
|
|
try {
|
|
|
|
|
beginDate = format.parse(beginDateStr);
|
|
|
|
|
endDate= format.parse(endDateStr);
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
day=(endDate.getTime()-beginDate.getTime())/(24*60*60*1000);
|
|
|
|
|
//System.out.println("相隔的天数="+day);
|
|
|
|
|
return day;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 得到n天之后的日期
|
|
|
|
|
* @param days
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getAfterDayDate(String days) {
|
|
|
|
|
int daysInt = Integer.parseInt(days);
|
|
|
|
|
Calendar canlendar = Calendar.getInstance(); // java.util包
|
|
|
|
|
canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
|
|
|
|
|
Date date = canlendar.getTime();
|
|
|
|
|
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
String dateStr = sdfd.format(date);
|
|
|
|
|
return dateStr;
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-19 14:36:11 +08:00
|
|
|
|
/**
|
|
|
|
|
* 获取30天之前的日期字符串
|
|
|
|
|
* @return yyyyMMdd格式时间字符串
|
|
|
|
|
*/
|
|
|
|
|
public static String getBeforeDayDate() {
|
|
|
|
|
Calendar canlendar = Calendar.getInstance();
|
|
|
|
|
canlendar.setTime(new Date());
|
|
|
|
|
canlendar.add(Calendar.DATE, -30);
|
|
|
|
|
Date date = canlendar.getTime();
|
|
|
|
|
SimpleDateFormat sdfd = new SimpleDateFormat("yyyyMMdd");
|
|
|
|
|
String dateStr = sdfd.format(date);
|
|
|
|
|
return dateStr;
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-07 09:32:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* 得到n天之后是周几
|
|
|
|
|
* @param days
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getAfterDayWeek(String days) {
|
|
|
|
|
int daysInt = Integer.parseInt(days);
|
|
|
|
|
Calendar canlendar = Calendar.getInstance(); // java.util包
|
|
|
|
|
canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
|
|
|
|
|
Date date = canlendar.getTime();
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("E");
|
|
|
|
|
String dateStr = sdf.format(date);
|
|
|
|
|
return dateStr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 按照yyyy-MM-dd HH:mm:ss的格式,日期转字符串
|
|
|
|
|
* @param date
|
|
|
|
|
* @return yyyy-MM-dd HH:mm:ss
|
|
|
|
|
*/
|
|
|
|
|
public static String date2Str(Date date){
|
|
|
|
|
return date2Str(date,"yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
}
|
|
|
|
|
public static String date3Str(Date date){
|
|
|
|
|
return date2Str(date,"yyyy-M-d");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static String date4Str(Date date){
|
|
|
|
|
return date2Str(date,"yyyy-MM-dd");
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 按照yyyy-MM-dd HH:mm:ss的格式,字符串转日期
|
|
|
|
|
* @param date
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static Date str2Date(String date){
|
|
|
|
|
if(Tools.notEmpty(date)){
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
try {
|
|
|
|
|
return sdf.parse(date);
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
return new Date();
|
|
|
|
|
}else{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 把时间根据时、分、秒转换为时间段
|
|
|
|
|
* @param StrDate
|
|
|
|
|
*/
|
|
|
|
|
public static String getTimes(String StrDate){
|
|
|
|
|
String resultTimes = "";
|
|
|
|
|
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
java.util.Date now;
|
|
|
|
|
try {
|
|
|
|
|
now = new Date();
|
|
|
|
|
java.util.Date date=df.parse(StrDate);
|
|
|
|
|
long times = now.getTime()-date.getTime();
|
|
|
|
|
long day = times/(24*60*60*1000);
|
|
|
|
|
long hour = (times/(60*60*1000)-day*24);
|
|
|
|
|
long min = ((times/(60*1000))-day*24*60-hour*60);
|
|
|
|
|
long sec = (times/1000-day*24*60*60-hour*60*60-min*60);
|
|
|
|
|
|
|
|
|
|
StringBuffer sb = new StringBuffer();
|
|
|
|
|
//sb.append("发表于:");
|
|
|
|
|
if(hour>0 ){
|
|
|
|
|
sb.append(hour+"小时前");
|
|
|
|
|
} else if(min>0){
|
|
|
|
|
sb.append(min+"分钟前");
|
|
|
|
|
} else{
|
|
|
|
|
sb.append(sec+"秒前");
|
|
|
|
|
}
|
|
|
|
|
resultTimes = sb.toString();
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
return resultTimes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 按照参数format的格式,日期转字符串
|
|
|
|
|
* @param date
|
|
|
|
|
* @param format
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String date2Str(Date date,String format){
|
|
|
|
|
if(date!=null){
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat(format);
|
|
|
|
|
return sdf.format(date);
|
|
|
|
|
}else{
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取当年的第一天
|
|
|
|
|
* @param year
|
|
|
|
|
* @author zhangyue
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getCurrYearFirst(){
|
|
|
|
|
Calendar currCal=Calendar.getInstance();
|
|
|
|
|
int currentYear = currCal.get(Calendar.YEAR);
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
calendar.clear();
|
|
|
|
|
calendar.set(Calendar.YEAR, currentYear);
|
|
|
|
|
Date currYearFirst = calendar.getTime();
|
|
|
|
|
return sdfDay.format(currYearFirst);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取当年的最后一天
|
|
|
|
|
* @param year
|
|
|
|
|
* @author zhangyue
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getCurrYearLast(){
|
|
|
|
|
Calendar currCal=Calendar.getInstance();
|
|
|
|
|
int currentYear = currCal.get(Calendar.YEAR);
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
calendar.clear();
|
|
|
|
|
calendar.set(Calendar.YEAR, currentYear);
|
|
|
|
|
calendar.roll(Calendar.DAY_OF_YEAR, -1);
|
|
|
|
|
Date currYearLast = calendar.getTime();
|
|
|
|
|
return sdfDay.format(currYearLast);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取当前季度第一天
|
|
|
|
|
* @author zhangyue
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String quarterStart() {
|
|
|
|
|
Date dBegin = new Date();
|
|
|
|
|
Calendar calBegin = Calendar.getInstance();
|
|
|
|
|
calBegin.setTime(dBegin);
|
|
|
|
|
int remainder = calBegin.get(Calendar.MONTH) % 3;
|
|
|
|
|
int month = remainder != 0 ? calBegin.get(Calendar.MONTH) - remainder: calBegin.get(Calendar.MONTH);
|
|
|
|
|
|
|
|
|
|
calBegin.set(Calendar.MONTH, month);
|
|
|
|
|
calBegin.set(Calendar.DAY_OF_MONTH, calBegin.getActualMinimum(Calendar.DAY_OF_MONTH));
|
|
|
|
|
|
|
|
|
|
calBegin.setTime(calBegin.getTime());
|
|
|
|
|
return sdfDay.format(calBegin.getTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取当前季度最后一天
|
|
|
|
|
* @author zhangyue
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String quarterEnd() {
|
|
|
|
|
Date dEnd = new Date();
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
calendar.setTime(dEnd);
|
|
|
|
|
int remainder = (calendar.get(Calendar.MONTH) + 1) % 3;
|
|
|
|
|
int month = remainder != 0 ? calendar.get(Calendar.MONTH) + (3 - remainder) : calendar.get(Calendar.MONTH);
|
|
|
|
|
calendar.set(Calendar.MONTH, month);
|
|
|
|
|
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
|
|
|
|
|
calendar.setTime(calendar.getTime());
|
|
|
|
|
return sdfDay.format(calendar.getTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取本月第一天日期
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getMonthFirstDay() {
|
|
|
|
|
Calendar thisMonthFirstDateCal = Calendar.getInstance();
|
|
|
|
|
thisMonthFirstDateCal.set(Calendar.DAY_OF_MONTH, 1);
|
|
|
|
|
String thisMonthFirstTime = sdfDay.format(thisMonthFirstDateCal.getTime());
|
|
|
|
|
return thisMonthFirstTime;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取本月最后一天日期
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String getMonthEndDay() {
|
|
|
|
|
Calendar thisMonthEndDateCal = Calendar.getInstance();
|
|
|
|
|
thisMonthEndDateCal.set(Calendar.DAY_OF_MONTH, thisMonthEndDateCal.getActualMaximum(Calendar.DAY_OF_MONTH));
|
|
|
|
|
String thisMonthEndTime = sdfDay.format(thisMonthEndDateCal.getTime());
|
|
|
|
|
return thisMonthEndTime;
|
|
|
|
|
}
|
|
|
|
|
public static boolean timeCalendar(Date nowTime, Date amBeginTime, Date amEndTime) {
|
|
|
|
|
//设置当前时间
|
|
|
|
|
Calendar date = Calendar.getInstance();
|
|
|
|
|
date.setTime(nowTime);
|
|
|
|
|
//设置开始时间
|
|
|
|
|
Calendar amBegin = Calendar.getInstance();
|
|
|
|
|
amBegin.setTime(amBeginTime);//上午开始时间
|
|
|
|
|
//设置结束时间
|
|
|
|
|
Calendar amEnd = Calendar.getInstance();
|
|
|
|
|
amEnd.setTime(amEndTime);//上午结束时间
|
|
|
|
|
//处于开始时间之后,和结束时间之前的判断
|
|
|
|
|
if ((date.after(amBegin) && date.before(amEnd))) {
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取本周的第一天
|
|
|
|
|
* @return String
|
|
|
|
|
* **/
|
|
|
|
|
public static String getWeekStart(){
|
|
|
|
|
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 设置时间格式
|
|
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
|
|
// Calendar c = Calendar.getInstance();
|
|
|
|
|
cal.add(Calendar.DAY_OF_MONTH, 0);
|
|
|
|
|
// cal.setTime(time);
|
|
|
|
|
|
|
|
|
|
// 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
|
|
|
|
|
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
|
|
|
|
|
if (1 == dayWeek) {
|
|
|
|
|
cal.add(Calendar.DAY_OF_MONTH, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
|
|
|
|
|
|
|
|
|
|
int day = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
|
|
|
|
|
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
|
|
|
|
|
/*
|
|
|
|
|
* cal.add(Calendar.DATE, 6);
|
|
|
|
|
* System.out.println("所在周星期日的日期:"+sdf.format(cal.getTime()));
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime()) + " 00:00:00";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取本周的最后一天
|
|
|
|
|
* @return String
|
|
|
|
|
* **/
|
|
|
|
|
public static String getWeekEnd(){
|
|
|
|
|
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 设置时间格式
|
|
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
|
|
// Calendar c = Calendar.getInstance();
|
|
|
|
|
cal.add(Calendar.DAY_OF_MONTH, 0);
|
|
|
|
|
// cal.setTime(time);
|
|
|
|
|
|
|
|
|
|
// 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
|
|
|
|
|
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
|
|
|
|
|
if (1 == dayWeek) {
|
|
|
|
|
cal.add(Calendar.DAY_OF_MONTH, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
|
|
|
|
|
|
|
|
|
|
int day = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
|
|
|
|
|
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
|
|
|
|
|
|
|
|
|
|
cal.add(Calendar.DATE, 6);
|
|
|
|
|
|
|
|
|
|
return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime()) + " 23:59:59";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断时间格式 格式必须为“YYYY-MM-dd”
|
|
|
|
|
* 2004-2-30 是无效的
|
|
|
|
|
* 2003-2-29 是无效的
|
|
|
|
|
* @param sDate
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static boolean isLegalDate(String sDate) {
|
|
|
|
|
int legalLen = 10;
|
|
|
|
|
if ((sDate == null) || (sDate.length() != legalLen)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
try {
|
|
|
|
|
Date date = formatter.parse(sDate);
|
|
|
|
|
return sDate.equals(formatter.format(date));
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 时间比较
|
|
|
|
|
* @param amBeginTime
|
|
|
|
|
* @param amEndTime
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static boolean timeCompare(Date amBeginTime, Date amEndTime) {
|
|
|
|
|
//设置开始时间
|
|
|
|
|
Calendar amBegin = Calendar.getInstance();
|
|
|
|
|
amBegin.setTime(amBeginTime);//上午开始时间
|
|
|
|
|
//设置结束时间
|
|
|
|
|
Calendar amEnd = Calendar.getInstance();
|
|
|
|
|
amEnd.setTime(amEndTime);//上午结束时间
|
|
|
|
|
//开始时间是否早于结束时间
|
|
|
|
|
if (amBegin.before(amEnd)) {
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取6个月内月份日期
|
|
|
|
|
* @param flag 结果是否显示年份
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static List<String> getHalfYearMonth(boolean flag) {
|
|
|
|
|
Calendar c = Calendar.getInstance();
|
|
|
|
|
c.add(Calendar.MONTH, -4);
|
|
|
|
|
String before_six = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH);// 六个月前
|
|
|
|
|
List<String> result = new ArrayList<String>();
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");// 格式化为年月
|
|
|
|
|
Calendar min = Calendar.getInstance();
|
|
|
|
|
Calendar max = Calendar.getInstance();
|
|
|
|
|
try {
|
|
|
|
|
min.setTime(sdf.parse(before_six));
|
|
|
|
|
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
|
|
|
|
|
max.setTime(sdf.parse(sdf.format(new Date())));
|
|
|
|
|
|
|
|
|
|
//不含当前月
|
|
|
|
|
|
|
|
|
|
/* int month = max.get(Calendar.MONTH);
|
|
|
|
|
max.set(Calendar.MONTH, month-1);
|
|
|
|
|
*/
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
|
|
|
|
|
Calendar curr = min;
|
|
|
|
|
while (curr.before(max)) {
|
|
|
|
|
if (flag) {
|
|
|
|
|
result.add(sdf.format(curr.getTime()));
|
|
|
|
|
} else {
|
|
|
|
|
result.add(curr.get(Calendar.MONTH) + 1 + "月");
|
|
|
|
|
}
|
|
|
|
|
curr.add(Calendar.MONTH, 1);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取本月所有日期
|
|
|
|
|
* @param isAllDay 结果是否显示本月所有日期
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static List<String> getThisMonth(boolean isAllDay) {
|
|
|
|
|
Calendar c = Calendar.getInstance();
|
|
|
|
|
List<String> result = new ArrayList<String>();
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 格式化为年月
|
|
|
|
|
Calendar min = Calendar.getInstance();
|
|
|
|
|
Calendar max = Calendar.getInstance();
|
|
|
|
|
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
|
|
|
|
|
if (isAllDay) {
|
|
|
|
|
max.set(max.get(Calendar.YEAR), (max.get(Calendar.MONTH) + 1), 1); //本月所有天
|
|
|
|
|
} else {
|
|
|
|
|
max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), c.get(Calendar.DATE) + 1); //本月初到当前日期所有天
|
|
|
|
|
}
|
|
|
|
|
Calendar curr = min;
|
|
|
|
|
while (curr.before(max)) {
|
|
|
|
|
result.add(sdf.format(curr.getTime()));
|
|
|
|
|
curr.add(Calendar.DATE, 1);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取近多少天
|
|
|
|
|
* @param date 日期
|
|
|
|
|
* @param days 近几天(负数.日期以前几天;正数.日期以后几天)
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static List<String> getNearDays(Date date, int days) {
|
|
|
|
|
Calendar currentDate = Calendar.getInstance();
|
|
|
|
|
currentDate.setTime(date);
|
|
|
|
|
Calendar nearDate = Calendar.getInstance();
|
|
|
|
|
nearDate.setTime(date);
|
|
|
|
|
nearDate.add(Calendar.DATE, days);
|
|
|
|
|
List<String> result = new ArrayList<String>();
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 格式化为年月
|
|
|
|
|
if (currentDate.before(nearDate)) {
|
|
|
|
|
Calendar curr = currentDate;
|
|
|
|
|
nearDate.set(nearDate.get(Calendar.YEAR), nearDate.get(Calendar.MONTH), nearDate.get(Calendar.DATE));
|
|
|
|
|
while (curr.before(nearDate)) {
|
|
|
|
|
result.add(sdf.format(curr.getTime()));
|
|
|
|
|
curr.add(Calendar.DATE, 1);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
Calendar curr = nearDate;
|
|
|
|
|
currentDate.set(currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE) + 1);
|
|
|
|
|
while (curr.before(currentDate)) {
|
|
|
|
|
result.add(sdf.format(curr.getTime()));
|
|
|
|
|
curr.add(Calendar.DATE, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//根据当前日期获得最近n周的日期区间(不包含本周)
|
|
|
|
|
public static String getFromToDate(SimpleDateFormat sdf, Date date, int n, int option, int k) {
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
calendar.setTime(date);
|
|
|
|
|
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
|
|
|
|
|
int offset = 0 == option ? 1 - dayOfWeek : 7 - dayOfWeek;
|
|
|
|
|
int amount = 0 == option ? offset - (n - 1 + k) * 7 : offset - k * 7;
|
|
|
|
|
calendar.add(Calendar.DATE, amount);
|
|
|
|
|
return sdf.format(calendar.getTime());
|
|
|
|
|
}
|
|
|
|
|
public static SimpleDateFormat sdf() {
|
|
|
|
|
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
}
|
|
|
|
|
// 获取上周的开始时间
|
|
|
|
|
public static String getBeginDayOfLastWeek() {
|
|
|
|
|
//上周日期
|
|
|
|
|
SimpleDateFormat sdf = sdf();
|
|
|
|
|
String beginDate = getFromToDate(sdf, new Date(), 1, 0, 1);
|
|
|
|
|
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
try {
|
|
|
|
|
calendar.setTime(sdf.parse(beginDate));
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
|
|
calendar.set(Calendar.MINUTE, 0);
|
|
|
|
|
calendar.set(Calendar.SECOND, 0);
|
|
|
|
|
calendar.set(Calendar.MILLISECOND, 0);
|
|
|
|
|
return sdf.format(calendar.getTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取上周的结束时间
|
|
|
|
|
public static String getEndDayOfLastWeek() {
|
|
|
|
|
//上周日期
|
|
|
|
|
SimpleDateFormat sdf = sdf();
|
|
|
|
|
String endDate = getFromToDate(sdf, new Date(), 1, 1, 1);
|
|
|
|
|
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
try {
|
|
|
|
|
calendar.setTime(sdf.parse(endDate));
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
calendar.set(Calendar.HOUR_OF_DAY, 23);
|
|
|
|
|
calendar.set(Calendar.MINUTE, 59);
|
|
|
|
|
calendar.set(Calendar.SECOND, 59);
|
|
|
|
|
return sdf.format(calendar.getTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获得上月第一天0点时间
|
|
|
|
|
public static String getTimesLastMonthmorning() {
|
|
|
|
|
//上月日期
|
|
|
|
|
Calendar c=Calendar.getInstance();
|
|
|
|
|
c.add(Calendar.MONTH, -1);
|
|
|
|
|
SimpleDateFormat sdf = sdf();
|
|
|
|
|
String gtimelast = sdf.format(c.getTime()); //上月
|
|
|
|
|
int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), lastMonthMaxDay, 23, 59, 59);
|
|
|
|
|
|
|
|
|
|
//按格式输出
|
|
|
|
|
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-01 00:00:00");
|
|
|
|
|
String gtime = sdf2.format(c.getTime()); //上月第一天
|
|
|
|
|
return gtime;
|
|
|
|
|
}
|
|
|
|
|
// 获得上月最后一天24点时间
|
|
|
|
|
public static String getTimesLastMonthnight() {
|
|
|
|
|
//上月日期
|
|
|
|
|
Calendar c=Calendar.getInstance();
|
|
|
|
|
c.add(Calendar.MONTH, -1);
|
|
|
|
|
SimpleDateFormat sdf = sdf();
|
|
|
|
|
String gtimelast = sdf.format(c.getTime()); //上月
|
|
|
|
|
int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), lastMonthMaxDay, 23, 59, 59);
|
|
|
|
|
|
|
|
|
|
//按格式输出
|
|
|
|
|
String gtime = sdf.format(c.getTime()); //上月最后一天
|
|
|
|
|
return gtime;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 获取上一季度 开始和结束时间
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static String[] getLastQuarter() {
|
|
|
|
|
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
String[] range = new String[2];
|
|
|
|
|
Calendar startCalendar = Calendar.getInstance();
|
|
|
|
|
startCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3 - 1) * 3);
|
|
|
|
|
startCalendar.set(Calendar.DAY_OF_MONTH, 1);
|
|
|
|
|
Date startDate = startCalendar.getTime();
|
|
|
|
|
range[0] = sdfd.format(startDate);
|
|
|
|
|
|
|
|
|
|
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));
|
|
|
|
|
Date endDate = endCalendar.getTime();
|
|
|
|
|
range[1] = sdfd.format(endDate);
|
|
|
|
|
return range;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取当日期前/后某个月的所有日期 0 本月 负数 之前的月份 。正数 之后的月份
|
|
|
|
|
*
|
|
|
|
|
* @param months
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static List<String> getDayListOfMonth(Integer months) {
|
|
|
|
|
List<String> list = new ArrayList<>();
|
|
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
|
|
cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + months);
|
|
|
|
|
int month = cal.get(Calendar.MONTH) + 1;
|
|
|
|
|
String monthStr = month < 10 ? "0" + month : String.valueOf(month);
|
|
|
|
|
int year = cal.get(Calendar.YEAR);
|
|
|
|
|
int day = cal.getActualMaximum(Calendar.DATE);
|
|
|
|
|
for (int i = 1; i <= day; i++) {
|
|
|
|
|
String d = String.valueOf(i);
|
|
|
|
|
if (i < 10) {
|
|
|
|
|
d = "0" + d;
|
|
|
|
|
}
|
|
|
|
|
list.add(year + "-" + monthStr + "-" + d);
|
|
|
|
|
}
|
|
|
|
|
return list;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 字符串的日期格式的计算
|
|
|
|
|
*/
|
|
|
|
|
public static int daysBetween(String smdate, String bdate) {
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
|
|
long time1 = 0;
|
|
|
|
|
long time2 = 0;
|
|
|
|
|
try {
|
|
|
|
|
cal.setTime(sdf.parse(smdate));
|
|
|
|
|
time1 = cal.getTimeInMillis();
|
|
|
|
|
cal.setTime(sdf.parse(bdate));
|
|
|
|
|
time2 = cal.getTimeInMillis();
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
// TODO Auto-generated catch block
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
long between_days = (time2 - time1) / (1000 * 3600 * 24);
|
|
|
|
|
|
|
|
|
|
return Integer.parseInt(String.valueOf(between_days));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 得到几天前的时间
|
|
|
|
|
*
|
|
|
|
|
* @param d
|
|
|
|
|
* @param day
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static Date getDateBefore(Date d, int day) {
|
|
|
|
|
Calendar now = Calendar.getInstance();
|
|
|
|
|
now.setTime(d);
|
|
|
|
|
now.set(Calendar.DATE, now.get(Calendar.DATE) - day);
|
|
|
|
|
return now.getTime();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 把天数转换成data
|
|
|
|
|
* @param days
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static Date getDateByDayInt(int days) {
|
|
|
|
|
Calendar c = Calendar.getInstance();
|
|
|
|
|
c.set(1900, 0, 1);
|
|
|
|
|
c.add(Calendar.DATE, days - 2);
|
|
|
|
|
return c.getTime();
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 时间换算(秒级)
|
|
|
|
|
*/
|
|
|
|
|
public static String calculateDateSecond(String dateStr, int second) {
|
|
|
|
|
Date date = str2Date(dateStr);
|
|
|
|
|
if (date != null) {
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
calendar.setTime(date);
|
|
|
|
|
calendar.add(Calendar.SECOND, second);
|
|
|
|
|
SimpleDateFormat sdf = sdf();
|
|
|
|
|
return sdf.format(calendar.getTime());
|
|
|
|
|
}
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 港务局 的 隐患评审 判断阶段是否超时
|
|
|
|
|
* @param evaluate_stage_end_time
|
|
|
|
|
* @return
|
|
|
|
|
* @throws Exception
|
|
|
|
|
*/
|
|
|
|
|
public static int determineTime (String evaluate_stage_end_time) throws Exception{
|
|
|
|
|
|
|
|
|
|
//转换本阶段结束时间为时间戳
|
|
|
|
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
Date evaluate_stage_end_time_parse = format.parse(evaluate_stage_end_time);
|
|
|
|
|
long evaluate_stage_end_time_temp = evaluate_stage_end_time_parse.getTime();//评审开始时间
|
|
|
|
|
//本阶段结束时间+4小时
|
|
|
|
|
long fourhour = 14400000;//4小时
|
|
|
|
|
//计算评审结束时间
|
|
|
|
|
long finally_time = evaluate_stage_end_time_temp+fourhour;//评审结束时间
|
|
|
|
|
//判断当前时间是否在可评审阶段内
|
|
|
|
|
String sysdate = format.format(new Date());
|
|
|
|
|
Date parse = format.parse(sysdate);
|
|
|
|
|
long current_time = parse.getTime();//当前时间
|
|
|
|
|
//判断当前时间是否在评审时间内,上阶段是否发布
|
|
|
|
|
if(current_time >= evaluate_stage_end_time_temp && current_time <= finally_time){
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
2024-03-26 10:20:26 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取本月某一天的日期
|
|
|
|
|
*/
|
|
|
|
|
public static String getMonthAnyDay(int day) {
|
|
|
|
|
Calendar thisMonthAnyDateCal = Calendar.getInstance();
|
|
|
|
|
thisMonthAnyDateCal.set(Calendar.DAY_OF_MONTH, day);
|
|
|
|
|
String thisMonthAnyTime = sdfDay.format(thisMonthAnyDateCal.getTime());
|
|
|
|
|
return thisMonthAnyTime;
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-07 09:32:12 +08:00
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
|
|
|
|
|
// List<String> halfYearMonth = DateUtil.getHalfYearMonth(true);
|
|
|
|
|
// System.out.println(halfYearMonth);
|
|
|
|
|
// List<String> halfYearMonth = DateUtil.getThisMonth(false);
|
|
|
|
|
// System.out.println(halfYearMonth);
|
|
|
|
|
// List<String> nearDays = DateUtil.getNearDays(new Date(), -9);
|
|
|
|
|
// System.out.println(nearDays);
|
|
|
|
|
// System.out.println(getLastQuarter()[0]+"----------"+getLastQuarter()[1]);
|
|
|
|
|
/*System.out.println(isLegalDate("2010-02-29"));*/
|
|
|
|
|
/*System.out.println(quarterStart()+" 00:00:00");
|
|
|
|
|
System.out.println(getCurrYearLast()+" 23:59:59");*/
|
|
|
|
|
String dateStr = "2022-06-29 16:59:55";
|
|
|
|
|
for (int i = 0; i < 10; i++) {
|
|
|
|
|
System.out.println(dateStr);
|
|
|
|
|
dateStr = calculateDateSecond(dateStr, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|