前言
最近開發遇到查詢第幾周內數據的問題,從而計算環比、同比,這就需要知道週數對應的日期,上網搜索並總結出一個實體類,方便以後開發。
具體代碼
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;
}
}
後記
實際運用可以調整傳入參數的類型,和返回值的類型,方便開發。