由于工作需要对数据库读出的日期做一些特殊处理,比如获取当前周周一,当前月第一天之类,只借助Date类显然无法简单的完成需求,这种时候需要使用util包下的Calendar类。
Calendar类的帮助文档:https://www.yiibai.com/java/util/java_util_calendar.html
然后自己写了一个util,记录一下。
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import com.mastercom.comm.DateUtil;
/**
* @author DELL
*
*/
public class TimeUtil {
/**
* @param dt
* @return
* 获取本月所有日期
*/
public static List<Date> monthToDates(Date dt)
{
List<Date> dts = new ArrayList<Date>();
Calendar ca = Calendar.getInstance();
ca.setTime(dt);
ca.set(ca.get(Calendar.YEAR),ca.get(Calendar.MONTH)+1, 0);
int dayNumOfMonth = ca.get(Calendar.DAY_OF_MONTH);
ca.set(Calendar.DAY_OF_MONTH, 1);// 从一号开始
for (int i = 0; i < dayNumOfMonth; i++, ca.add(Calendar.DATE, 1)) {
toZero(ca);
Date d = ca.getTime();
dts.add(d);
}
return dts;
}
/**
* @param dt
* @return
* 获取本月第一天
*/
public static Date getFstDayOfMonth(Date dt) {
Calendar ca = Calendar.getInstance();
ca.setTime(dt);
ca.set(Calendar.DAY_OF_MONTH, 1);
toZero(ca);
return ca.getTime();
}
/**
* @param dt
* @return
* 获取本月最后一天
*/
public static Date getLstDayOfMonth(Date dt) {
Calendar ca = Calendar.getInstance();
ca.setTime(dt);
ca.add(Calendar.MONTH, 1);
ca.set(Calendar.DAY_OF_MONTH, 0);
toZero(ca);
return ca.getTime();
}
/**
* @param dt
* @return
* 获取本周所有的日期,按时间先后排序
*/
public static List<Date> mondayToDates(Date dt)
{
List<Date> dts = new ArrayList<Date>();
Calendar ca = Calendar.getInstance();
ca.setTime(dt);
int weekNum = 7;
ca.setTime(getFstDayOfWeek(dt));// 从周一开始
for (int i = 0; i < weekNum; i++, ca.add(Calendar.DATE, 1)) {
toZero(ca);
Date d = ca.getTime();
dts.add(d);
}
return dts;
}
/**
* @param date
* @return
* 获取后一天
*/
public static Date getNextDay(Date date) {
return getDayAfterToday(date,1);
}
/**
* @param date
* @return
* 获取n天后,为负数则表示几天前
*/
public static Date getDayAfterToday(Date date,int n) {
Calendar ca = Calendar.getInstance();
ca.setTime(date);
ca.add(Calendar.DAY_OF_YEAR, n);
toZero(ca);
return ca.getTime();
}
/**
* @param dt
* @return
* 获取本周第一天
*/
public static Date getFstDayOfWeek(Date dt) {
Calendar ca = Calendar.getInstance();
ca.setTime(dt);
ca.setFirstDayOfWeek(Calendar.MONDAY); //设置周一为第一天
ca.setMinimalDaysInFirstWeek(7);
ca.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
toZero(ca);
return ca.getTime();
}
/**
* @param days
* @return
* 获取每一天的周一并排序
* 除去当前周
*/
public static List<Date> DaysToMondays(List<Date> days){
Set<Date> mondays = new TreeSet<Date>();
for(Date dt : days) {
if(isNowWeek(dt)) continue;
mondays.add(getFstDayOfWeek(dt));
}
return new ArrayList<>(mondays);
}
/**
* @param days
* @return
* 获取每月第一天并排序
* 除去当前月
*/
public static List<Date> DaysToMonths(List<Date> days){
Set<Date> mondays = new TreeSet<Date>();
Calendar ca = Calendar.getInstance();
for(Date dt : days) {
if(isNowMonth(dt)) continue;
ca.setTime(dt);
ca.set(Calendar.DAY_OF_MONTH, 1);
toZero(ca);
mondays.add(ca.getTime());
}
return new ArrayList<>(mondays);
}
/**
* @param ca
* @return
* 将时间调到0时0分0秒
*/
public static Calendar toZero(Calendar ca) {
ca.set(Calendar.HOUR_OF_DAY, 0);
ca.set(Calendar.MINUTE, 0);
ca.set(Calendar.SECOND, 0);
ca.set(Calendar.MILLISECOND, 0);
return ca;
}
/**
* @param date
* @return
* 判断是否是当前月
*/
public static boolean isNowMonth(Date date) {
Date fst = getFstDayOfMonth(new Date());
Date fstOfDate = getFstDayOfMonth(date);
if(fst.equals(fstOfDate)) return true;
return false;
}
/**
* @param date
* @return
* 判断是否是当前周
*/
public static boolean isNowWeek(Date date) {
Date fst = getFstDayOfWeek(new Date());
Date fstOfDate = getFstDayOfWeek(date);
if(fst.equals(fstOfDate)) return true;
return false;
}
public static void main(String[] args){
List<Date> days = new ArrayList<>();
Date dt = new Date();
days.add(dt);
// days.add(TimeUtil.getDayAfterToday(dt, 11));
// days.add(TimeUtil.getDayAfterToday(dt, -11));
// days.add(TimeUtil.getDayAfterToday(dt, 111));
// days.add(TimeUtil.getDayAfterToday(dt, -311));
// days.add(TimeUtil.getDayAfterToday(dt, 17));
days.add(DateUtil.getDate(2018, 5, 20));
// System.out.println(TimeUtil.DaysToMondays(days));
System.out.println(TimeUtil.mondayToDates(DateUtil.getDate(2018, 5, 20)));
// System.out.println(isNowMonth(new Date()));
// System.out.println(isNowWeek(new Date()));
}
}