/*
* @(#)Period.java 2012-5-8 下午10:17:04
*
* Copyright (c) 2011-2012 Makersoft.org all rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
*
*/
package org.makersoft.core.domain.model;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Embeddable;
/**
* 时间范围(左闭右开)
*/
@Embeddable
public class Period implements Serializable {
private static final long serialVersionUID = -3374887172570339193L;
/**
* 开始时间
*/
@Column(name = "PERIOD_START")
private Date start;
/**
* 结束时间
*/
@Column(name = "PERIOD_END")
private Date end;
public Period() {
super();
}
public Period(Date start, Date end) {
super();
if (end != null && start != null && end.compareTo(start) < 0) {
throw new IllegalArgumentException("start:" + start + ", end:" + end + ", 结束时间应该大于起始时间!");
}
this.start = start;
this.end = end;
}
/**
* 当天 00:00:00 - 23:59:59
*
* @return
*/
public static Period today() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
Date start = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.MILLISECOND, -1);
Date end = cal.getTime();
Period period = new Period(start, end);
return period;
}
/**
* 交集
*/
public Period intersection(final Period other) {
if (other == null)
return null;
Period result = null;
if (overlap(other)) {
Date start_ = this.start.after(other.start) ? this.start : other.start;
Date end_ = this.end.after(other.end) ? other.end : this.end;
result = new Period(start_, end_);
}
return result;
}
/**
* 并集
*/
public Period union(final Period other) {
if (other == null)
return this;
Period result = null;
if (overlap(other)) {
Date start_ = this.start.before(other.start) ? this.start : other.start;
Date end_ = this.end.before(other.end) ? other.end : this.end;
result = new Period(start_, end_);
}
return result;
}
/**
* 是否包含
*/
public boolean isIncluded(final Date date) {
if (date == null)
return false;
if (start == null && end == null)
return true;
else if (start == null)
return (end.after(date) || end.equals(date));
else if (end == null)
return (start.before(date) || start.equals(date));
else
return (start.before(date) || start.equals(date)) && (end.after(date) || end.equals(date));
}
/**
* 是否包含
*/
public boolean isIncluded(final Period period) {
return this.isIncluded(period.start) && this.isIncluded(period.end);
}
/**
* 是否相交
*/
public boolean overlap(final Period period) {
return isIncluded(period.start) || period.isIncluded(this.start);
}
/**
* 起始时间差
*/
public long duration() {
return this.start.getTime() - this.end.getTime();
}
/**
* 是否过期
*/
public boolean isExpired(Date date) {
return this.isIncluded(date);
}
public String toString() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return "Period[" + df.format(start) + " to " + df.format(end) + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((end == null) ? 0 : end.hashCode());
result = prime * result + ((start == null) ? 0 : start.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Period other = (Period) obj;
if (end == null) {
if (other.end != null)
return false;
} else if (!end.equals(other.end))
return false;
if (start == null) {
if (other.start != null)
return false;
} else if (!start.equals(other.start))
return false;
return true;
}
public Date getStart() {
return start;
}
public void setStart(Date start) {
this.start = start;
}
public Date getEnd() {
return end;
}
public void setEnd(Date end) {
this.end = end;
}
}