import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import jodd.datetime.JDateTime;
/**
*
* 用于时间处理的工具,依赖于apache的commons-lang3,以@Component的形式存在于Spring容器中,调用时应在上下文环境中进行注入。
*
* @author
*
* <p><strong>最近修改者:</strong>$Author: $</p>
* <p><strong>最近修改于:</strong>$Date: 2015-04-16 15:13:24 +0800 (星期四, 16 四月 2015) $</p>
* <p><strong>当前库版本:</strong>$Rev: 2356 $</p>
*
*
*/
@Component("dateUtil")
public class DateUtil {
private String defaultDateFormat = "yyyy-MM-dd HH:mm:ss";
private String dateFormat = "yyyy-MM-dd";
private ConcurrentHashMap<String, List<String>> todayAxisCache = new ConcurrentHashMap<String, List<String>>(1);
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@Autowired
private ChartUtil chartUtil;
/**
* 给定一个时间对象,返回此时间当天的0点0分0秒。
*
* @param date
* 某一时间
* @return
* 当天的0点0分0秒的时间对象
*/
public Date truncate(final Date date) {
if(null != date) {
return DateUtils.truncate(date, Calendar.DAY_OF_MONTH);
}
return null;
}
/**
* 给定一个时间对象,返回此时间当天下一天的0点0分0秒。
*
* @param date
* 某一时间
* @return
* 当天的下一天的0点0分0秒的时间对象。
*/
public Date ceiling(final Date date) {
if(null != date) {
return DateUtils.ceiling(date, Calendar.DAY_OF_MONTH);
}
return null;
}
/**
* 将日期对象转换为指定format格式的字符串
*
* @param date
* @param format
* @return
*/
public String fromDate(final Date date, String format) {
if(null == date) {
return null;
}
if(null != format && 0 != format.trim().length()) {
return DateFormatUtils.format(date, format);
} else {
return DateFormatUtils.format(date, defaultDateFormat);
}
}
/**
* 将一个日期对象转换为格式如yyyy-MM-dd hh:mm:ss的字符串
* @param date
* @return
*/
public String fromDate(final Date date) {
return fromDate(date, null);
}
/**
* 将一个依指定格式的字符串日期转换为Date对象
* @param date
* 日期字符串,如为null,则返回null
* @param format
* 日期格式,如为null,则默认指定为yyyy-MM-dd hh:mm:ss
* @return
* 日期对象
*/
public Date toDate(final String date, final String format) {
Date d = null;
try {
if(null != date) {
if(null != format) {
d = DateUtils.parseDate(date, format);
} else {
d = DateUtils.parseDate(date, defaultDateFormat);
}
}
} catch (ParseException e) {
e.printStackTrace();
}
return d;
}
/**
* 将一个日期字符串依默认格式yyyy-MM-dd hh:mm:ss转换为Date对象
* @param date
* @return
*/
public Date toDate(final String date) {
return toDate(date, null);
}
/**
* 以interval为时间间隔,平均分割date1和date2这段区域的时间
* @param date1
* @param date2
* @param interval
* @return
*/
public List<String> dividePeriodOfTimeByInterval(Date date1, Date date2, int interval){
Date truncateDate1 = null;
Date truncateDate2 = null;
if(null != date1) {
truncateDate1 = DateUtils.truncate(date1, Calendar.DAY_OF_MONTH);
} else {
truncateDate1 = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH);
}
if(null != date2) {
truncateDate2 = DateUtils.truncate(date2, Calendar.DAY_OF_MONTH);
} else {
truncateDate2 = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH);
}
String cacheKey = DateFormatUtils.format(truncateDate1, ChartUtil.TIME_FORMAT_DEFAULT);
String cacheKeyToo = DateFormatUtils.format(truncateDate2, ChartUtil.TIME_FORMAT_DEFAULT);
List<String> expectedValue = todayAxisCache.get(cacheKey);
List<String> expectedValueToo = todayAxisCache.get(cacheKeyToo);
if (null != expectedValue && null != expectedValueToo) {
return expectedValue;
} else {
synchronized (todayAxisCache) {
todayAxisCache.clear();
List<String> newValue = new ArrayList<String>();
try {
//以interval为时间间隔,划分从date1到date2的时间段,返回字符串形式的日期的集合
newValue = chartUtil.timeAxisForPeriodDateByInterval(interval, date1, date2);
} catch (Exception e) {
e.printStackTrace();
}
todayAxisCache.putIfAbsent(cacheKey, newValue);
return newValue;
}
}
}
/**
* 给定当前日期 month个月后(前)第一天的日期(month可以为负数)
*
* @param date
* @param month
* @return
*/
public String getAfterMonthFirstDayDate(String date, int month) {
Calendar c = Calendar.getInstance();
SimpleDateFormat simpleFormat = new SimpleDateFormat(dateFormat);
Date dat = null;
try {
dat = simpleFormat.parse(date);
} catch (Exception e) {
}
c.setTime(dat);
c.add(Calendar.MONTH, month);
String afterMonthFirstDayDate = simpleFormat.format(c.getTime());
return afterMonthFirstDayDate;
}
/**
* 给定当前日期 year年后(前)第一天的日期(year可以为负数)
*
* @param date
* @param year
* @return
*/
public String getNextYearFirst(String date, int year) {
String str = "";
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
Date dat = null;
try {
dat = sdf.parse(date);
} catch (Exception e) {
}
Calendar c = Calendar.getInstance();
c.setTime(dat);
c.add(Calendar.YEAR, year);
c.set(Calendar.DAY_OF_YEAR, year);
str = sdf.format(c.getTime());
return str;
}
/**
* 给定一个日期返回当年的第一天
* @param date
* @return
*/
public String getCurrentYearFirst(String date) {
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
Date dat = null;
try {
dat = sdf.parse(date);
} catch (Exception e) {
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
String years = dateFormat.format(dat);
return years+"-01-01";
}
/**
* 给定一个日期返回当年的最后一天
* @param date
* @return
*/
public String getCurrentYearEnd(String date){
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
Date dat = null;
try {
dat = sdf.parse(date);
} catch (Exception e) {
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
String years = dateFormat.format(dat);
return years+"-12-31";
}
/**
* 给定一个日期返回n天后/前的日期
* @param date
* @return
*/
public String getCurrentWeekday(String date,int day) {
JDateTime jDateTime = new JDateTime(date);
jDateTime.addDay(day);
return jDateTime.toString("YYYY-MM-DD");
}
/**
* 给定一个日期返回当前月的第一天
* @param date
* @return
*/
public String getFirstDayOfMonth(String date){
String str = "";
SimpleDateFormat sdf=new SimpleDateFormat(dateFormat);
Date dat = null;
try {
dat = sdf.parse(date);
} catch (Exception e) {
}
Calendar lastDate = Calendar.getInstance();
lastDate.setTime(dat);
lastDate.set(Calendar.DATE,1);//设为当前月的1 号
str=sdf.format(lastDate.getTime());
return str;
}
/**
* 给定一个日期返回month个月的最后一天
* @param date
* @return
*/
public String getDefaultDay(String date,int month){
String str = "";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date dat = null;
try {
dat = sdf.parse(date);
} catch (Exception e) {
}
Calendar lastDate = Calendar.getInstance();
lastDate.setTime(dat);
lastDate.set(Calendar.DATE,1);//设为当前月的1 号
lastDate.add(Calendar.MONTH,month);//加一个月,变为下月的1 号
lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天
str=sdf.format(lastDate.getTime());
return str;
}
/**
* 给定当前日期 week个周后第一天的日期
*
* @param date
* @param week
* @return
*/
public String lastMonday(Date time) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(time);
while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
calendar.add(Calendar.DAY_OF_WEEK, -1);
}
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
int offset = 1 - dayOfWeek;
calendar.add(Calendar.DATE, offset - 7);
return fromDate(getFirstDayOfWeek(calendar.getTime(), 2),dateFormat);
}
/**
* 得到某一天的该星期的第一日 00:00:00
*
* @param date
* @param firstDayOfWeek
* 一个星期的第一天为星期几
*
* @return
*/
private Date getFirstDayOfWeek(Date date, int firstDayOfWeek) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.setFirstDayOfWeek(firstDayOfWeek);//设置一星期的第一天是哪一天
cal.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);//指示一个星期中的某天
cal.set(Calendar.HOUR_OF_DAY, 0);//指示一天中的小时。HOUR_OF_DAY 用于 24 小时制时钟。例如,在 10:04:15.250 PM 这一时刻,HOUR_OF_DAY 为 22。
cal.set(Calendar.MINUTE, 0);//指示一小时中的分钟。例如,在 10:04:15.250 PM 这一时刻,MINUTE 为 4。
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
/**
* 给定一个时间返回当天的23:59:59
* @return
*/
public String getTodayLastTime(Date date){
SimpleDateFormat simpleFormat = new SimpleDateFormat(dateFormat);
String format = simpleFormat.format(date);
return String.format("%s 23:59:59", format);
}
/**
* 给定一个日期返回昨天00:00:00_23:59:59
* @param date
* @return
*/
public String getYesterdayELTime(String datestr){
String yesterdayDate = getCurrentWeekday(datestr, -1);
SimpleDateFormat simpleFormat = new SimpleDateFormat(dateFormat);
Date date=null;
try {
date = simpleFormat.parse(yesterdayDate);
} catch (ParseException e) {
e.printStackTrace();
}
Date earlyMorning = truncate(date);
String fromDate = fromDate(earlyMorning);
String todayLastTime = getTodayLastTime(earlyMorning);
return String.format("%s_%s", fromDate,todayLastTime);
}
/**
* 给定一个日期获取当前日期的上一个月的 第一天日期_最后一天日期
* @param date
* @return firstDate_lastDate
*/
public String getMonthFLDate(Date date){
SimpleDateFormat format = new SimpleDateFormat(dateFormat);
Calendar cal_1=Calendar.getInstance();
cal_1.setTime(date);
cal_1.add(Calendar.MONTH, -1);
cal_1.set(Calendar.DAY_OF_MONTH,1);
String fristDate = format.format(cal_1.getTime());
//获取前月的最后一天
Calendar cale = Calendar.getInstance();
//设置为1号,当前日期既为本月第一天
cale.set(Calendar.DAY_OF_MONTH,0);
String lastDate = format.format(cale.getTime());
return String.format("%s_%s", fristDate,lastDate);
}
/**
* 给定一个日期获取当前日期的interval(正/负)个月的 第一天日期_最后一天日期
* @param date
* @param interval : 从0开始向前或向后几个月
* @param intervalAddOne :intervalAddOne=interval+1
* @return firstDate_lastDate
*/
public String getMonthFLDate(Date date,int interval,int intervalAddOne){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal_1=Calendar.getInstance();
cal_1.setTime(date);
cal_1.add(Calendar.MONTH, interval);
cal_1.set(Calendar.DAY_OF_MONTH,1);
String fristDate = format.format(cal_1.getTime());
//获取前月的最后一天
Calendar cale = Calendar.getInstance();
//设置为1号,当前日期既为本月第一天
cale.setTime(date);
cale.add(Calendar.MONTH, intervalAddOne);
cale.set(Calendar.DAY_OF_MONTH,cale.getActualMaximum(Calendar.DAY_OF_MONTH));
String lastDate = format.format(cale.getTime());
return String.format("%s_%s", fristDate,lastDate);
}
/**
* 给定一个日期获取这个月的 第一天日期
* @param date
* @return firstDate_lastDate
*/
public String getMonthFDate(Date date){
SimpleDateFormat format = new SimpleDateFormat(dateFormat);
Calendar cal_1=Calendar.getInstance();
cal_1.setTime(date);
cal_1.set(Calendar.DAY_OF_MONTH,1);
String fristDate = format.format(cal_1.getTime());
return fristDate;
}
/**
* 给定一个日期获取这个月的 最后一天日期
* @param date
* @return firstDate_lastDate
*/
public String getMonthLDate(Date date){
SimpleDateFormat format = new SimpleDateFormat(dateFormat);
//获取前月的最后一天
Calendar cale = Calendar.getInstance();
cale.setTime(date);
cale.add(Calendar.MONTH, 1);
//设置为1号,当前日期既为本月第一天
cale.set(Calendar.DAY_OF_MONTH,0);
String lastDate = format.format(cale.getTime());
return lastDate;
}
/**
* 给定一段时间返回所有时间(天)
*/
public List<String> getDayBetweenDate(Date beginDate, Date endDate) {
if(beginDate.getTime() == endDate.getTime()){
List<String> date = new ArrayList<String>();
date.add(fromDate(beginDate, "yyyy-MM-dd"));
return date;
}
List<String> lDate = new ArrayList<String>();
lDate.add(fromDate(beginDate, "yyyy-MM-dd"));//把开始时间加入集合
Calendar cal = Calendar.getInstance();
//使用给定的 Date 设置此 Calendar 的时间
cal.setTime(beginDate);
boolean bContinue = true;
while (bContinue) {
//根据日历的规则,为给定的日历字段添加或减去指定的时间量
cal.add(Calendar.DAY_OF_MONTH, 1);
// 测试此日期是否在指定日期之后
if (endDate.after(cal.getTime())) {
lDate.add(fromDate(cal.getTime(),"yyyy-MM-dd"));
} else {
break;
}
}
lDate.add(fromDate(endDate, "yyyy-MM-dd"));//把结束时间加入集合
return lDate;
}
/**
* 给定一段时间,返回所有的时间(月)
* @param beginDate
* @param endDate
* @return
*/
public List<String> getMonthBetweenDate(Date beginDate, Date endDate) {
if(beginDate.getTime() == endDate.getTime()){
List<String> date = new ArrayList<String>();
date.add(fromDate(beginDate, "yyyy-MM"));
return date;
}
List<String> lDate = new ArrayList<String>();
lDate.add(fromDate(beginDate, "yyyy-MM"));//把开始时间加入集合
Calendar cal = Calendar.getInstance();
//使用给定的 Date 设置此 Calendar 的时间
cal.setTime(beginDate);
boolean bContinue = true;
while (bContinue) {
//根据日历的规则,为给定的日历字段添加或减去指定的时间量
cal.add(Calendar.MONTH, 1);
// 测试此日期是否在指定日期之后
if (endDate.after(cal.getTime())) {
lDate.add(fromDate(cal.getTime(),"yyyy-MM"));
} else {
break;
}
}
lDate.add(fromDate(endDate, "yyyy-MM"));//把结束时间加入集合
return lDate;
}
/**
* 给定一段时间,返回所有的时间(年)
* @param beginDate
* @param endDate
* @return
*/
public List<String> getYearBetweenDate(Date beginDate, Date endDate) {
if(beginDate.getTime() == endDate.getTime()){
List<String> date = new ArrayList<String>();
date.add(fromDate(beginDate, "yyyy"));
return date;
}
List<String> lDate = new ArrayList<String>();
lDate.add(fromDate(beginDate, "yyyy"));//把开始时间加入集合
Calendar cal = Calendar.getInstance();
//使用给定的 Date 设置此 Calendar 的时间
cal.setTime(beginDate);
boolean bContinue = true;
while (bContinue) {
//根据日历的规则,为给定的日历字段添加或减去指定的时间量
cal.add(Calendar.YEAR, 1);
// 测试此日期是否在指定日期之后
if (endDate.after(cal.getTime())) {
lDate.add(fromDate(cal.getTime(),"yyyy"));
} else {
break;
}
}
lDate.add(fromDate(endDate, "yyyy"));//把结束时间加入集合
return lDate;
}
/**
* 通过给定一个日期返回当前月的所有天
* @param year
* @param month
* @param day 如果为几就是从当月几号到月底
* @return
*/
public List<String> getMonthFullDay(String date){
String[] split = date.split("-");
int year = Integer.parseInt(split[0]);
int month = Integer.parseInt(split[1]);
int day = 1;
List<String> fullDayList = new ArrayList<String>();
if(day <= 0 ) day = 1;
Calendar cal = Calendar.getInstance();// 获得当前日期对象
cal.clear();// 清除信息
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month - 1);// 1月从0开始
cal.set(Calendar.DAY_OF_MONTH, day);// 设置为1号,当前日期既为本月第一天
int count = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int j = 0; j <= (count-1);) {
if(sdf.format(cal.getTime()).equals(getLastDay(year, month)))
break;
cal.add(Calendar.DAY_OF_MONTH, j == 0 ? +0 : +1);
j++;
fullDayList.add(sdf.format(cal.getTime()));
}
return fullDayList;
}
public static String getLastDay(int year,int month){
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, 0);
return sdf.format(cal.getTime());
}
/**
* 返回一年中的12个月
*/
public List<String> getAllMonths(){
List<String> list = new ArrayList<String>();
for (int i=1;i<13;i++){
String str ="";
if (i<10){
str ="0"+i;
}else{
str =i+"";
}
list.add(str);
}
return list;
}
/**
* 给定年份,返回这一年12个月字符串的集合
* @param date:yyyy
* @return yyyy-MM
*/
public List<String> getYearMonths(Date date){
String time = fromDate(date,"yyyy");
List<String> list = new ArrayList<String>();
for (int i=1;i<13;i++){
String str ="";
if (i<10){
str ="0"+i;
}else{
str =i+"";
}
str = time+"-"+str;
list.add(str);
}
return list;
}
/**
* 获取当月的 天数
*/
public int getCurrentMonthDay() {
Calendar a = Calendar.getInstance();
a.set(Calendar.DATE, 1);
a.roll(Calendar.DATE, -1);
int maxDate = a.get(Calendar.DATE);
return maxDate;
}
/**
* 根据年 月 获取对应的月份 天数
*/
public int getDaysByYearMonth(int year, int month) {
Calendar a = Calendar.getInstance();
a.set(Calendar.YEAR, year);
a.set(Calendar.MONTH, month - 1);
a.set(Calendar.DATE, 1);
a.roll(Calendar.DATE, -1);
int maxDate = a.get(Calendar.DATE);
return maxDate;
}
/**
* 获取n年前/后的第一天的日期
* @param date
* @param num n年前num应传(例如:-1) n年后num应传(例如:1)
* @return
*/
public Date getFirstDay(Date date,int num){
if(date!=null){
Integer year = Integer.valueOf(fromDate(date, "yyyy"));
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.YEAR, year+num);
Date time = cal.getTime();
String fromDate = fromDate(time, "yyyy");
StringBuffer sbf = new StringBuffer();
sbf.append(fromDate);
sbf.append("-01-01 00:00:00");
return toDate(sbf.toString());
}
return null;
}
/**
* 给定一个日期获取当前日期当前月的 第一天日期_最后一天日期
* @param date
* @return firstDate_lastDate
*/
public String getMonthFLTime(Date date){
SimpleDateFormat format = new SimpleDateFormat(dateFormat);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int frist = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, frist);
String fristDate =format.format(cal.getTime());
Calendar cal_1 = Calendar.getInstance();
cal_1.setTime(date);
int last = cal_1.getActualMaximum(Calendar.DAY_OF_MONTH);
cal_1.set(Calendar.DAY_OF_MONTH, last);
String lastDate = format.format(cal_1.getTime());
return String.format("%s_%s", fristDate,lastDate);
}
}
时间处理的工具类
最新推荐文章于 2024-06-19 15:09:37 发布