/*
* DateTimeUtils
* Copyright (C) 2009 AaronLiu
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cn.net.uglyduck.commons.lang.time;
import org.apache.commons.lang.Validate;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.time.DateUtils;
/**
* 日期时间处理工具类
*
* @author <b>Aaron Liu</b>
* @date 2009-07-18
*/
public final class DateTimeUtils {
/**
* 私有构造器, 此工具类不允许被实例化
*/
private DateTimeUtils() {
}
/**
* 克隆日期时间数据的另一种方法。<br>
* <br>
* 传统的clone克隆日时对象中保存的毫秒值;<br>
* 本方法只克隆对象中有效成份。各日时类型的有效成份如下:<br>
* util.Date 年、月、日、时、分、秒<br>
* sql.Date 年、月、日<br>
* sql.Time 时、分、秒<br>
* sql.Timestamp 年、月、日、时、分、秒、纳秒<br>
* 例如:
*
* <pre>
* java.sql.Date obj = new java.sql.Date(946659600000L);
* java.util.Date tmp = DateTimeUtils.clone(obj);
* assertTrue(tmp.getClass().equals(java.sql.Date.class));
* assertTrue(tmp.compareTo(obj) < 0);
* assertTrue(DateTimeUtils.compareTo(tmp, obj) == 0);
* </pre>
*
* @param obj
* 需要克隆的日时对象
* @return 克隆对象
*/
public static java.util.Date clone(java.util.Date obj) {
if (obj == null)
return null;
return clone(obj, obj.getClass());
}
@SuppressWarnings("unchecked")
private static java.util.Date clone(java.util.Date obj, Class cls) {
Validate.notNull(obj);
java.util.Date tmp = null;
if (java.util.Date.class.equals(cls)) {
tmp = new java.util.Date(obj.getTime());
}
else if (java.sql.Date.class.equals(cls)) {
tmp = java.sql.Date.valueOf(new java.sql.Date(obj.getTime())
.toString());
}
else if (java.sql.Time.class.equals(cls)) {
tmp = java.sql.Time.valueOf(new java.sql.Time(obj.getTime())
.toString());
}
else if (java.sql.Timestamp.class.equals(cls)) {
tmp = java.sql.Timestamp.valueOf(new java.sql.Timestamp(obj
.getTime()).toString());
}
return tmp;
}
/**
* 两个日时对象的比较方法<br>
* 根据compareTo的实现标准,两个日时对象的类型必须一致。<br>
* 否则此方法抛出ClassCastException异常。<br>
* <br>
* 传统的compareTo比较的是日时对象中保存的毫秒值;<br>
* 本方法只比较对象中有效成份。各日时类型的有效成份如下:<br>
* util.Date 年、月、日、时、分、秒<br>
* sql.Date 年、月、日<br>
* sql.Time 时、分、秒<br>
* sql.Timestamp 年、月、日、时、分、秒、纳秒<br>
* 例如:
*
* <pre>
* java.sql.Date d1 = new java.sql.Date(946656000000L);
* java.sql.Date d2 = new java.sql.Date(946659600000L);
* assertTrue(d1.compareTo(d2) < 0);
* assertTrue(DateTimeUtils.compareTo(d1, d2) == 0);
* </pre>
*
* @param date1
* 时间参数1
* @param date2
* 时间参数2
* @throws NullPointerException
* 时间参数1,时间参数2任意一个为null时抛出异常
* @throws ClassCastException
* 两个时间对象的类型不一致时,抛出此异常
* @return 当时间参数1晚于时间参数2时,返回值为正数; <br>
* 当时间参数1早于时间参数2时,返回值为负数;<br>
* 当时间参数1等于时间参数2时,返回值为0
*/
public static int compareTo(java.util.Date date1, java.util.Date date2) {
if (!date1.getClass().equals(date2.getClass())) {
throw new ClassCastException();
}
return CompareToBuilder.reflectionCompare(
clone(date1, date1.getClass()).getTime(), clone(date2,
date2.getClass()).getTime());
}
/**
* 从 <br>
* java.util.Date、<br>
* java.sql.Date、<br>
* java.sql.Time、<br>
* java.sql.Timestamp <br>
* 四种对象中 <br>
* 克隆出一个新的java.util.Date对象。<br>
* 本方法只复制obj中的年、月、日、时、分、秒信息。
*
* @param obj
* 旧的日时对象
* @throws IllegalArgumentException
* obj参数为NULL时抛出此异常
* @return 新的日时对象
*/
public static java.util.Date getUtilDate(java.util.Date obj) {
return clone(obj, java.util.Date.class);
}
/**
* 获取当前日时。<br>
* 此函数为同步化函数,<br>
* 可保证每次调用此函数返回不同的值。<br>
*
* @return java.util.Date格式的当前日时信息
*/
synchronized public static java.util.Date getUtilDate() {
return new java.util.Date();
}
/**
* 从 <br>
* java.util.Date、<br>
* java.sql.Date、<br>
* java.sql.Time、<br>
* java.sql.Timestamp <br>
* 四种对象中 <br>
* 克隆出一个新的java.sql.Date对象。<br>
* 本方法只复制obj中的年、月、日信息。
*
* @param obj
* 旧的日时对象
* @throws IllegalArgumentException
* obj参数为NULL时抛出此异常
* @return 新的日期对象
*/
public static java.sql.Date getDate(java.util.Date obj) {
return (java.sql.Date) clone(obj, java.sql.Date.class);
}
/**
* 获取当前日时的日期信息。<br>
* 此函数为同步化函数,<br>
* 可保证每次调用此函数返回不同的值。
*
* @return java.sql.Date格式的当前日时信息
*/
synchronized public static java.sql.Date getDate() {
return getDate(getUtilDate());
}
/**
* 从 <br>
* java.util.Date、<br>
* java.sql.Date、<br>
* java.sql.Time、<br>
* java.sql.Timestamp <br>
* 四种对象中 <br>
* 克隆出一个新的java.sql.Time对象。<br>
* 本方法只复制obj中的时、分、秒信息。
*
* @param obj
* 旧的日时对象
* @throws IllegalArgumentException
* obj参数为NULL时抛出此异常
* @return 新的时间对象
*/
public static java.sql.Time getTime(java.util.Date obj) {
return (java.sql.Time) clone(obj, java.sql.Time.class);
}
/**
* 获取当前日时的时间信息。<br>
* 此函数为同步化函数,<br>
* 可保证每次调用此函数返回不同的值。
*
* @return java.sql.Time格式的当前日时信息
*/
synchronized public static java.sql.Time getTime() {
return getTime(getUtilDate());
}
/**
* 从 <br>
* java.util.Date、<br>
* java.sql.Date、<br>
* java.sql.Time、<br>
* java.sql.Timestamp <br>
* 四种对象中 <br>
* 克隆出一个新的java.sql.Timestamp对象。<br>
* 本方法只复制obj中的年、月、日、时、分、秒、纳秒信息。
*
* @param obj
* 旧的日时对象
* @throws IllegalArgumentException
* obj参数为NULL时抛出此异常
* @return 新的时间戳对象
*/
public static java.sql.Timestamp getTimestamp(java.util.Date obj) {
return (java.sql.Timestamp) clone(obj, java.sql.Timestamp.class);
}
/**
* 获取当前日时的时间戳信息。<br>
* 此函数为同步化函数,<br>
* 可保证每次调用此函数返回不同的值。
*
* @return java.sql.Timestamp格式的当前日时信息
*/
synchronized public static java.sql.Timestamp getTimestamp() {
return getTimestamp(getUtilDate());
}
/**
* 判断指定日期是否为今天
*
* @param obj
* 指定日期<br>
* 类型可以是util.Date、sql.Date和sql.Timestamp
* @throws IllegalArgumentException
* 如果指定的day为null时抛出此异常
* @return 如果指定日时是今天则返回TRUE,否则返回FALSE。
*/
public static boolean isToday(java.util.Date obj) {
Validate.notNull(obj);
return compareTo(getDate(), getDate(obj)) == 0;
}
/**
* 在指定日时对象基础上增加指定的天数并返回新对象;<br>
* 原始对象没有改变。 不同于apache.org的DateUtils方法在于<br>
* 只返回与原始对象相同的类型。
*
* @param obj
* 原始日时对象
* @param amount
* 增加的天数(可以为负数)
* @return 增加天数之后的新对象
*/
public static java.util.Date addDays(java.util.Date obj, int amount) {
return clone(DateUtils.addDays(obj, amount), obj.getClass());
}
/**
* 在指定日时对象基础上增加指定的月份数并返回新对象;<br>
* 原始对象没有改变。 不同于apache.org的DateUtils方法在于<br>
* 只返回与原始对象相同的类型。
*
* @param obj
* 原始日时对象
* @param amount
* 增加的月份数(可以为负数)
* @return 增加月份数之后的新对象
*/
public static java.util.Date addMonths(java.util.Date obj, int amount) {
return clone(DateUtils.addMonths(obj, amount), obj.getClass());
}
/**
* 在指定日时对象基础上增加指定的年数并返回新对象;<br>
* 原始对象没有改变。 不同于apache.org的DateUtils方法在于<br>
* 只返回与原始对象相同的类型。
*
* @param obj
* 原始日时对象
* @param amount
* 增加的年数(可以为负数)
* @return 增加年数之后的新对象
*/
public static java.util.Date addYears(java.util.Date obj, int amount) {
return clone(DateUtils.addYears(obj, amount), obj.getClass());
}
/**
* 在指定日时对象基础上增加指定的周数并返回新对象;<br>
* 原始对象没有改变。 不同于apache.org的DateUtils方法在于<br>
* 只返回与原始对象相同的类型。
*
* @param obj
* 原始日时对象
* @param amount
* 增加的周数(可以为负数)
* @return 增加周数之后的新对象
*/
public static java.util.Date addWeeks(java.util.Date obj, int amount) {
return clone(DateUtils.addWeeks(obj, amount), obj.getClass());
}
/**
* 在指定日时对象基础上增加指定的小时数并返回新对象;<br>
* 原始对象没有改变。 不同于apache.org的DateUtils方法在于<br>
* 只返回与原始对象相同的类型。
*
* @param obj
* 原始日时对象
* @param amount
* 增加的小时数(可以为负数)
* @return 增加小时数之后的新对象
*/
public static java.util.Date addHours(java.util.Date obj, int amount) {
return clone(DateUtils.addHours(obj, amount), obj.getClass());
}
/**
* 在指定日时对象基础上增加指定的分钟数并返回新对象;<br>
* 原始对象没有改变。 不同于apache.org的DateUtils方法在于<br>
* 只返回与原始对象相同的类型。
*
* @param obj
* 原始日时对象
* @param amount
* 增加的分钟数(可以为负数)
* @return 增加分钟数之后的新对象
*/
public static java.util.Date addMinutes(java.util.Date obj, int amount) {
return clone(DateUtils.addMinutes(obj, amount), obj.getClass());
}
/**
* 在指定日时对象基础上增加指定的秒数并返回新对象;<br>
* 原始对象没有改变。 不同于apache.org的DateUtils方法在于<br>
* 只返回与原始对象相同的类型。
*
* @param obj
* 原始日时对象
* @param amount
* 增加的秒数(可以为负数)
* @return 增加秒数之后的新对象
*/
public static java.util.Date addSeconds(java.util.Date obj, int amount) {
return clone(DateUtils.addSeconds(obj, amount), obj.getClass());
}
/**
* 在指定日时对象基础上增加指定的毫秒数并返回新对象;<br>
* 原始对象没有改变。 不同于apache.org的DateUtils方法在于<br>
* 只返回与原始对象相同的类型。
*
* @param obj
* 原始日时对象
* @param amount
* 增加的毫秒数(可以为负数)
* @return 增加毫秒数之后的新对象
*/
public static java.util.Date addMilliseconds(java.util.Date obj, int amount) {
return clone(DateUtils.addMilliseconds(obj, amount), obj.getClass());
}
}