分享工具类:获取一年中所有的周末并输出字符串集合

本工具类是基于Calendar类编写的,由于笔者水平有限,有不足之处欢迎大家批评指正!谢谢!

工具类提供两个入参,指定年份 和 指定输出日期字符串的格式


package com.useCalendar;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
 * 获取各种各样需求的的日期们
 * @author liangy
 *
 */
public class GetDatesUtil {
	/**
	 * 获取指定年份的所有周末的日期,以字符串集合返回
	 * @param year 传入“thisYear” 自动按今年处理;传入形如yyyy 格式的字符串按指定年份处理,例如“2008”
	 * @param pattern 返回字符串格式,可以指定型如“yyyy-MM-dd”
	 * @return List集合,集合中字符串按照入参pattern生成
	 * @throws ParseException  转型异常,您输入的入参若不是型如yyyy类型的会抛此异常
	 */
	public static List<String> getWeekendsOfTheYear(String year,String pattern) throws ParseException{
		//声明并初始化List
		List<String> list = new ArrayList<String>();
		//声明并初始化日期转型工具
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		
		//声明并初始化欲处理年份(目标年份)对应的Calendar
		Calendar calendar = Calendar.getInstance();
		//算法是按照向后递增天数进行统计,需要设定初始日期为元月一号
		if(year=="thisYear"){//按今年处理
			calendar.set(Calendar.DAY_OF_YEAR, 1);
			calendar.set(Calendar.HOUR_OF_DAY, 1);
		}else{//按指定年份处理
			Date targetDate = (new SimpleDateFormat("yyyy")).parse(year);//SimpleDateFormat只设定年份默认日期为元月一号
			calendar.setTime(targetDate);
		}
		
		
		//以克隆方式生成另一个Calendar实例。代表下一年元月一号,作为递增上限
		Calendar calendarUpperLimit =(Calendar) calendar.clone();
		calendarUpperLimit.set(Calendar.YEAR,calendarUpperLimit.get(Calendar.YEAR)+1);
				
		
		//如果元月一号为星期日
		if(calendar.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){
			//将元月一号的日期字符串先添加至集合中
			String dayOfNewYear= sdf.format(calendar.getTime());
			list.add(dayOfNewYear);
		}
		//定位到目标年的第一个星期六
		calendar.add(Calendar.DAY_OF_YEAR, Calendar.SATURDAY-calendar.get(Calendar.DAY_OF_WEEK));
		
		String saturday;
		String sunday;
		for(;calendar.before(calendarUpperLimit);calendar.add(Calendar.DAY_OF_YEAR, 6))
        {
			saturday= sdf.format(calendar.getTime());
			list.add(saturday);
			calendar.add(Calendar.DAY_OF_YEAR, 1);
			if(calendar.get(Calendar.YEAR)==calendarUpperLimit.get(Calendar.YEAR))
				//出现此情况的唯一可能性就是目标年的最后一天是周六,接下来的周日是下一年,往后的迭代要放弃。
				continue;
			sunday= sdf.format(calendar.getTime());
			list.add(sunday);
        }
		return list;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值