按月分隔时间段,java实现,DateRange

百度了一下,按月分隔时间的方法,普遍不是很易懂,或者代码太长,索性自己写了。同时,这个代码改成按周分隔,按小时分隔,按年分隔,都很容易,自己操作吧。

需要引入包:

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
	<version>3.7</version>
</dependency>

类代码如下:

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.time.DateUtils;

public class DateRange {
		
		private Date start;
		private Date end;
		
		public DateRange() {
			super();
		}
		
		public DateRange(Date start, Date end) {
			super();
			this.start = start;
			this.end = end;
		}
		
		/**
		 * 判断时间范围是否不为空,即开始时间不在结束时间之后
		 */
		public boolean isNotEmptyDateRange() {
			return start.before(end) || start.equals(end);
		}
		
		public List<DateRange> splitByMonth() {
			List<DateRange> result = new ArrayList<>();
			
			if(!this.isNotEmptyDateRange()) {
				return result;
			}
			
			Calendar sc = Calendar.getInstance();
			sc.setTime(start);
			Calendar ec = Calendar.getInstance();
			ec.setTime(end);
			
			if (this.isSameMonth(sc, ec)) {
				result.add(this);
				return result;
			}
			
			while(sc.before(ec)) {
				DateRange d = new DateRange();
				d.setStart(sc.getTime());
                //向时间点之后取整,这里以月取整,就是下月初第一天零点
                //还有一个方法是truncate是向之前的时间取整,和celling正好相反
                //为什么celling有向后取整的意思,因为吊灯,天花板,之类的英文就是celling
				sc = DateUtils.ceiling(sc, Calendar.MONDAY);
                //这里主要考虑最后一个月的情况,这个if其实可以提到while外面,性能会更好一点
                //我懒得提了
				if(sc.before(ec)) {
					d.setEnd(sc.getTime());
				} else {
					d.setEnd(ec.getTime());
				}
				result.add(d);
			}
			
			return result;
			
		}
		
		private boolean isSameMonth(final Calendar cal1, final Calendar cal2) {
			return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)
					&& cal1.get(Cale
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值