日期时间处理工具类

/*
* 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) &lt; 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) &lt; 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());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值