前言
最近开发遇到查询第几周内数据的问题,从而计算环比、同比,这就需要知道周数对应的日期,上网搜索并总结出一个实体类,方便以后开发。
具体代码
import java.text.SimpleDateFormat;
import java.time.YearMonth;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateUtil {
/**
* 取得当前日期是多少周
*
* @param date
* @return
*/
public int getWeekOfYear(Date date) {
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setMinimalDaysInFirstWeek(7);
c.setTime (date);
return c.get(Calendar.WEEK_OF_YEAR);
}
/**
* 得到某一年周的总数
*
* @param year
* @return
*/
public int getMaxWeekNumOfYear(int year) {
Calendar c = new GregorianCalendar();
c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);
return getWeekOfYear(c.getTime());
}
/**
* 得到某年某周的第一天
*
* @param year(yyyy)
* @param week
* @return
*/
public String getFirstDayOfWeek(String year, String week) {
Calendar c = new GregorianCalendar();
c.set(Calendar.YEAR, Integer.valueOf(year));
c.set (Calendar.MONTH, Calendar.JANUARY);
c.set(Calendar.DATE, 1);
Calendar cal = (GregorianCalendar) c.clone();
cal.add(Calendar.DATE, (Integer.valueOf(week)-1) * 7);
return getFirstDayOfWeek(cal.getTime());
}
/**
* 得到某年某周的最后一天
*
* @param year(yyyy)
* @param week
* @return
*/
public String getLastDayOfWeek(String year, String week) {
Calendar c = new GregorianCalendar();
c.set(Calendar.YEAR, Integer.valueOf(year));
c.set(Calendar.MONTH, Calendar.JANUARY);
c.set(Calendar.DATE, 1);
Calendar cal = (GregorianCalendar) c.clone();
cal.add(Calendar.DATE , (Integer.valueOf(week)-1) * 7);
return getLastDayOfWeek(cal.getTime());
}
/**
* 得到某年前一年某周的第一天
*
* @param year(yyyy)
* @param week
* @return
*/
public String getLastYearFirstDayOfWeek(String year, String week) {
Calendar c = new GregorianCalendar();
c.set(Calendar.YEAR, Integer.valueOf(year)-1);
c.set (Calendar.MONTH, Calendar.JANUARY);
c.set(Calendar.DATE, 1);
Calendar cal = (GregorianCalendar) c.clone();
cal.add(Calendar.DATE, (Integer.valueOf(week)-1) * 7);
return getFirstDayOfWeek(cal.getTime ());
}
/**
* 得到某年前一年某周的最后一天
*
* @param year(yyyy)
* @param week
* @return
*/
public String getLastYearLastDayOfWeek(String year, String week) {
Calendar c = new GregorianCalendar();
c.set(Calendar.YEAR, Integer.valueOf(year)-1);
c.set(Calendar.MONTH, Calendar.JANUARY);
c.set(Calendar.DATE, 1);
Calendar cal = (GregorianCalendar) c.clone();
cal.add(Calendar.DATE , (Integer.valueOf(week)-1) * 7);
return getLastDayOfWeek(cal.getTime());
}
/**
* 取得指定日期所在周的第一天
*
* @param date
* @return String(yyyyMMdd)
*/
public String getFirstDayOfWeek(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(date);
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // Monday
return sdf.format(c.getTime());
}
/**
* 取得指定日期所在周的最后一天
*
* @param date
* @return String(yyyyMMdd)
*/
public String getLastDayOfWeek(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(date);
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
return sdf.format(c.getTime());
}
/**
* 取得当前日期所在周的第一天
*
* @return
*/
public Date getFirstDayOfWeek() {
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(new Date());
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // Monday
return c.getTime ();
}
/**
* 取得当前日期所在周的最后一天
*
* @return
*/
public Date getLastDayOfWeek() {
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(new Date());
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
return c.getTime();
}
/**
* 获取指定月所在的最后一天
*/
public String getLastDayOfMonth(String year,String month) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR,Integer.valueOf(year));
cal.set(Calendar.MONTH, Integer.valueOf(month)-1);
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, lastDay);
return sdf.format(cal.getTime());
}
/**
* 获取指定月前一个月所在的最后一天
*/
public String getLastMonthLastDayOfMonth(String year,String month) {
YearMonth yearMonth = YearMonth.parse(year+"-"+month);
String s=yearMonth.minus(1, ChronoUnit.MONTHS).toString();
String[] arr = s.split("-");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR,Integer.valueOf(arr[0]));
cal.set(Calendar.MONTH, Integer.valueOf(arr[1])-1);
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, lastDay);
return sdf1.format(cal.getTime());
}
/**
* 获取指定日期对应去年的这天
* @param day(yyyyMMdd)
*/
public String getNowOfLastYear(String day) {
return String.valueOf(Integer.parseInt(day.substring(0,4)) - 1)+day.substring(4,day.length());
}
/**
* 获得指定日期的前一天
* @param day(yyyyMMdd)
* @return
* @throws Exception
*/
public String getLastDayOfDay(String day){
Calendar c = Calendar.getInstance();
Date date=null;
try {
date = new SimpleDateFormat("yyyyMMdd").parse(day);
} catch (Exception e) {
e.printStackTrace();
}
c.setTime(date);
int day=c.get(Calendar.DATE);
c.set(Calendar.DATE,day-1);
String dayBefore=new SimpleDateFormat("yyyyMMdd").format(c.getTime());
return dayBefore;
}
}
后记
实际运用可以调整传入参数的类型,和返回值的类型,方便开发。