获取指定年度所有周的工具类

package com.unionx.core.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WeekUtils {

	 /**
	  * 
	  * Description:保存到缓存中,每年1月1日定时刷新
	  * @param args
	  * @return void
	  * @author name:
	  *
	  */
	 public static void main(String[] args) {
		  Calendar calendar = Calendar.getInstance();
			int year = calendar.get(Calendar.YEAR);//获取年份
			System.out.println("当前年份是:"+year);
			List<String[]> list = WeekUtils.getWeeksByYear(year);
			for (int i = 0; i < list.size(); i++) {
				WeekTime weekTime = new WeekTime();
				String[] arr = list.get(i);
				weekTime.setStartTime(DateUtils.stringToDate(arr[0], "yyyy-MM-dd"));
				weekTime.setEndTime(DateUtils.stringToDate(arr[1], "yyyy-MM-dd"));
				weekTime.setWeek(i+1);
				weekTime.setYear(year+"");
				RedisUtils.insertSelective(weekTime);
			} 
			System.out.println("日历更新完成");
	 }
	
	 /** 
	   * 返回指定年度的所有周。List中包含的是String[2]对象<br> 
	   * string[0]本周的开始日期,string[1]是本周的结束日期。<br>  
	   * 日期的格式为yyyy-MM-dd。<br>
	   * 每年的第一个周,必须包含星期一且是完整的七天。<br> 
	   * 星期一在哪一年,那么包含这个星期的周就是哪一年的周。<br> 
	   *  
	   * @param year 格式 yyyy  ,必须大于1900年度 小于9999年 
	   * @return
	   */
	 public static List<String[]> getWeeksByYear(final int year){
		 if(year<1900 || year >9999){  
			 throw new NullPointerException("年度必须大于等于1900年小于等于9999年"); 
		 }
	     //实现思路,首先计算当年有多少个周,然后找到每个周的开始日期和结束日期
		 Calendar calendar = new GregorianCalendar();
		 // 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
		 calendar.setFirstDayOfWeek(Calendar.MONDAY);
		 //设置每周的第一天为星期一
		 calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
		 //每周从周一开始 
		 //上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
		 calendar.setMinimalDaysInFirstWeek(7); 
		 //设置每周最少为7天//  
		 calendar.set(Calendar.YEAR, year); 
		 // 设置年度为指定的年//  
		 //首先计算当年有多少个周,每年都至少有52个周,个别年度有53个周 
		 int weeks = getWeekNumByYear(year);//  
		 System.out.println(year+"共有"+weeks+"个周"); 
		 List<String[]> result = new ArrayList<String[]>(weeks); 
		 for(int i=1;i<=weeks;i++){  
			 String[] tempWeek = new String[2]; 
			 tempWeek[0] = getYearWeekFirstDay(year,i);  
			 tempWeek[1] = getYearWeekEndDay (year,i);
			 result.add(tempWeek);//   
			 System.out.println(i+"="+tempWeek[0]+"_"+tempWeek[1]); 
		 } 
		 return result;
	 }
	 
	 /** 
	 * 计算指定年度共有多少个周。
	 * @param year 格式 yyyy  ,必须大于1900年度 小于9999年  
	 * @return   
	 */
	 public static int getWeekNumByYear(final int year){
		 if(year<1900 || year >9999){  
			 throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
		 }  
		 int result = 52;//每年至少有52个周 ,最多有53个周。
		 String date = getYearWeekFirstDay(year,53); 
		 if(date.substring(0, 4).equals(year+"")){ //判断年度是否相符,如果相符说明有53个周。
			 	result = 53;  
		 }  
		 System.out.println(result);
		 return result; 
	 }    
	 
	 /**    
	 * 计算某年某周的开始日期 
	 * @param yearNum 格式 yyyy  ,必须大于1900年度 小于9999年     
	 * @param weekNum 1到52或者53    
	 * @return 日期,格式为yyyy-MM-dd    
	 */    
	 public static String getYearWeekFirstDay(int yearNum,int weekNum)  {  
		 if(yearNum<1900 || yearNum >9999){ 
			 throw new NullPointerException("年度必须大于等于1900年小于等于9999年"); 
		 } 
		 Calendar cal = Calendar.getInstance();     
		 cal.setFirstDayOfWeek(Calendar.MONDAY); //设置每周的第一天为星期一  
		 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//每周从周一开始
		 //上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
		 cal.setMinimalDaysInFirstWeek(7);//设置每周最少为7天   
		 cal.set(Calendar.YEAR, yearNum);     
		 cal.set(Calendar.WEEK_OF_YEAR, weekNum); 
		 //分别取得当前日期的年、月、日  		 
		 return getFormatDate(cal.getTime());
	 }  

	 /***
	  * 
	  * Description:格式化时间
	  * @param time
	  * @return
	  * @return String
	  * @author name
	  *
	  */
	 private static String getFormatDate(Date time) {
		 String format = DateUtils.format(time, "yyyy-MM-dd");
		return format;
	 }
	 
	/**
	 * 计算某年某周的结束日期 
	 * @param yearNum 格式 yyyy  ,必须大于1900年度 小于9999年 
	 * @param weekNum 1到52或者53   
	 * @return 日期,格式为yyyy-MM-dd  
	 */  
	 public static String getYearWeekEndDay(int yearNum,int weekNum)  {
		 if(yearNum<1900 || yearNum >9999){
			 throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
		 }      
		 Calendar cal = Calendar.getInstance(); 
		 cal.setFirstDayOfWeek(Calendar.MONDAY); //设置每周的第一天为星期一  
		 cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//每周从周一开始
		 //上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。   
		 cal.setMinimalDaysInFirstWeek(7);//设置每周最少为7天   
		 cal.set(Calendar.YEAR, yearNum); 
		 cal.set(Calendar.WEEK_OF_YEAR, weekNum); 
		 return getFormatDate(cal.getTime());  
	 }
	 
	 /**
	  * 
	  * Description:判断一年的第几周
	  * @param datetime
	  * @return
	  * @throws java.text.ParseException
	  * @return Integer
	  * @author name
	  *
	  */
    public static Integer whatWeek(String datetime) throws java.text.ParseException {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Date date = format.parse(datetime);
		Calendar calendar = Calendar.getInstance();
		calendar.setFirstDayOfWeek(Calendar.MONDAY);
		calendar.setTime(date);
		Integer weekNumbe = calendar.get(Calendar.WEEK_OF_YEAR);
		return weekNumbe;
    }
    
    /**
     * 
     * Description:返回具体的周和年份
     * @param date
     * @return
     * @return Map<String,Integer>
     * @author name
     *
     */
    public static Map<String,Integer> getWeekAndYear(String date) {
        Map<String,Integer> result =  new HashMap<String,Integer>();
        Calendar cal = Calendar.getInstance();
 
        //--设置一周的开始,默认是周日,这里设置成星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat formatMon = new SimpleDateFormat("MM");
        SimpleDateFormat formatYear = new SimpleDateFormat("yyyy");
        Date d = null;
        try {
            d = format.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
 
        cal.setTime(d);
        int month = Integer.valueOf(formatMon.format(d));
        int year = Integer.valueOf(formatYear.format(d));
        
        int week = cal.get(Calendar.WEEK_OF_YEAR);
        result.put("week", week);
        if(week == 1 && month == 12){
            result.put("year", year + 1);
        }else{
 
            result.put("year", year);
        }
        System.out.println(result);
        return result;
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值