public class CalendarUtil {
/**
* 获取周历,周一为第一天
* 返回Map
* eg:
* wk_fisrt_day:2018-06-11
* wk_fisrt_day_md:06.11
* wk_end_day:2018-06-17
* wk_fisrt_day_md:06.17
*
* @param date
* @return
*/
public static Map<String,String> getWeekCh(Date date){
Map<String,String> map = new HashMap<String,String>();
int year = DateUtil.getYear(date);
// 计算当前周的起止日期
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
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);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
//System.out.println("所在周星期一的日期:" + cal.getTime());
String wk_fisrt_day = DateUtil.getFormatString(cal.getTime(),"yyyyMMdd");
if(Integer.valueOf(wk_fisrt_day) <= (year*10000+101)){// xxxx0101
map.put("wk_fisrt_day", year+"-01-01");
map.put("wk_fisrt_day_md", "01.01");
}else{
map.put("wk_fisrt_day", DateUtil.getFormatString(cal.getTime(),"yyyy-MM-dd"));
map.put("wk_fisrt_day_md", DateUtil.getFormatString(cal.getTime(),"MM.dd"));
}
//System.out.println("str:" + wk_fisrt_day);
//System.out.println(cal.getFirstDayOfWeek() + "-" + day + "+6="+ (cal.getFirstDayOfWeek() - day + 6));
cal.add(Calendar.DATE, 6);
//System.out.println("所在周星期日的日期:" + cal.getTime());
String wk_end_day = DateUtil.getFormatString(cal.getTime(),"yyyyMMdd");
if(Integer.valueOf(wk_end_day) >= (year*10000+1231)){// xxxx1231
map.put("wk_end_day", year+"-12-31");
map.put("wk_end_day_md", "12.31");
}else{
map.put("wk_end_day", DateUtil.getFormatString(cal.getTime(),"yyyy-MM-dd"));
map.put("wk_end_day_md", DateUtil.getFormatString(cal.getTime(),"MM.dd"));
}
//System.out.println("str:" + wk_end_day);
return map;
}
/**
* 返回一年的周列表
*
* @param year
* @return
*/
public static List<Map<String,String>> getWeekChList(Integer year){
List<Map<String,String>> weeklist = new ArrayList<Map<String,String>>();
try {
Date date0101 = DateUtil.getDate(year+"-01-01 00:00:00");
Map<String,String> week = getWeekCh(date0101);
week.put("text", "第1周("+week.get("wk_fisrt_day_md")+"~"+week.get("wk_end_day_md")+")");
String week_end = week.get("wk_end_day");
weeklist.add(week);
for (int i = 2; i < 54; i++) {
if(Integer.valueOf(week_end.replaceAll("-", "")) >= (year*10000+1231)){
break;
}else{
Date week_end_last = DateUtil.getDate(week_end+" 00:00:00");
Map<String,String> week_new = getWeekCh(DateUtil.addDays(week_end_last, 1));
week_end = week_new.get("wk_end_day");
week_new.put("text", "第"+i+"周("+week_new.get("wk_fisrt_day_md")+"~"+week_new.get("wk_end_day_md")+")");
weeklist.add(week_new);
}
}
} catch (ParseException e) {
e.printStackTrace();
}
return weeklist;
}
}
public class DateUtil {
public static Date addDays(Date date, int days) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, days);
return c.getTime();
}
public static Date getDate(String dateString) throws ParseException {
SimpleDateFormat new_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return new_sdf.parse(dateString);
}
public static Date getDate(Date date, String clock) throws ParseException {// clock
// 08:00
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(date) + " " + clock;
SimpleDateFormat new_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
return new_sdf.parse(dateStr);
}
public static Date getDateChg_mmss(Date date, String clock_mmss)
throws ParseException {// clock 08:00
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(date) + " " + getHour(date) + ":"
+ clock_mmss;
SimpleDateFormat new_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return new_sdf.parse(dateStr);
}
public static Date getDate235959(Date date) throws ParseException {// clock
// 08:00
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(date) + " 23:59:59";
SimpleDateFormat new_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return new_sdf.parse(dateStr);
}
public static Date getDateRemoveClock(Date date) throws ParseException {// "yyyy-MM-dd"
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String day = sdf.format(date);
return sdf.parse(day);
}
/**
* 获取年
*
* @param date
* @return
*/
public static int getYear(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.YEAR);
}
public static int getHour(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.HOUR_OF_DAY);
}
public static Date getYearBeginDate(Integer year) throws ParseException {
return getDate(year + "-01-01 00:00:00");
}
public static Date getYearEndDate(Integer year) throws ParseException {
return getDate(year + "-01-01 00:00:00");
}
public static Date getQuarterBeginDate(Integer year, Integer qindex)
throws ParseException {
String day = "01-01 00:00:00";
if (qindex == 0) {
day = "01-01 00:00:00";
} else if (qindex == 1) {
day = "04-01 00:00:00";
} else if (qindex == 2) {
day = "07-01 00:00:00";
} else if (qindex == 3) {
day = "10-01 00:00:00";
}
return DateUtil.getDate(year + "-" + day);
}
public static Date getHalfYearBeginDate(Integer year, Integer hindex)
throws ParseException {
if (hindex == 0) {
return DateUtil.getDate(year + "-01-01 00:00:00");
} else {
return DateUtil.getDate(year + "-07-01 00:00:00");
}
}
/**
* 获取季度 {0,1,2,3} 对应季度1,2,3,4
*
* @param date
* @return
*/
public static int getQuarter(Date date) {
return getMonth(date) / 3;
}
/**
* 获取半年度 {0,1} 对应上半年,下半年
*
* @param date
* @return
*/
public static int getHalfYear(Date date) {
return getMonth(date) / 6;
}
public static int getMonth(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.MONTH);
}
public static int getDay(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DATE);
}
public static int getDayOfWeek(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_WEEK);
}
public static int getDayOfMonth(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_MONTH);
}
public static int getDayOfYear(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_YEAR);
}
public static long getDayDiff(Date d1, Date d2) {
if (d1 == null || d2 == null)
return -1;
long diff = d1.getTime() - d2.getTime();
return diff / 1000 / 60 / 60 / 24;
}
public static String getFormatString(Date date, String format) {
SimpleDateFormat df = new SimpleDateFormat(format);
return df.format(date);
}
/**
* 获取两个日期相差的月数
*
* @param d1
* 较大的日期
* @param d2
* 较小的日期
* @return 如果d1>d2返回 月数差 否则返回0
*/
public static int getMonthDiff(Date d1, Date d2) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
if (c1.getTimeInMillis() < c2.getTimeInMillis())
return 0;
int year1 = c1.get(Calendar.YEAR);
int year2 = c2.get(Calendar.YEAR);
int month1 = c1.get(Calendar.MONTH);
int month2 = c2.get(Calendar.MONTH);
int day1 = c1.get(Calendar.DAY_OF_MONTH);
int day2 = c2.get(Calendar.DAY_OF_MONTH);
// 获取年的差值 假设 d1 = 2015-8-16 d2 = 2011-9-30
int yearInterval = year1 - year2;
// 如果 d1的 月-日 小于 d2的 月-日 那么 yearInterval-- 这样就得到了相差的年数
if (month1 < month2 || month1 == month2 && day1 < day2)
yearInterval--;
// 获取月数差值
int monthInterval = (month1 + 12) - month2;
if (day1 < day2)
monthInterval--;
monthInterval %= 12;
return yearInterval * 12 + monthInterval;
}
public static String getDate_yyyyMMdd(Date date, Integer days) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
cal.add(Calendar.DAY_OF_MONTH, days);
return sf.format(cal.getTime());
}
public static Date getDate(Date date, Integer days) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DAY_OF_MONTH, days);
return cal.getTime();
}
public static void main(String[] args) throws ParseException {
// System.out.println(getYear(new Date()));
// System.out.println(getQuarter(new Date()));
//
// System.out.println(0/6);
// System.out.println(1/6);
// System.out.println(2/6);
// System.out.println(3/6);
// System.out.println(4/6);
// System.out.println(5/6);
// System.out.println(6/6);
// System.out.println(7/6);
// System.out.println(8/6);
// System.out.println(9/6);
// System.out.println(10/6);
// System.out.println(11/6);
System.out.println(getDay(new Date()));
//System.out.println(getDate("2017-07-16 00:00:00"));
}
}
调用://获取所选年的周历数据
//从全局变量中获取所选年份的周历数据,若有,不必重复计算
List<Map<String,String>> week_list = (List<Map<String,String>>)request.getSession().getServletContext().getAttribute(year+"_wklist");
if(week_list == null){
week_list = CalendarUtil.getWeekChList(year);
request.getSession().getServletContext().setAttribute(year+"_wklist", week_list);
}