Java日期通用工具

/**
 * 日期通用工具
 * @author zhaohuihua
 */
public class DateTools {


    /** 工具类, 不可实例化 **/
    private DateTools() {}

    private static final Format DATE_FORMAT = new Format("yyyy-MM-dd");
    private static final Format DATE_TIME_FORMAT = 
        new Format("yyyy-MM-dd HH:mm:ss");
    private static final Format DATE_LONG_FORMAT = 
        new Format("yyyy-MM-dd HH:mm:ss.SSS");

    private static final Format TIME_LONG_FORMAT = new Format("HH:mm:ss.SSS");
    private static final Format TIME_FORMAT = new Format("HH:mm:ss");
    /** 将时区设置为格林威治标准时间时区, 避免将0:00解释为默认时区GMT+8的8:00 **/
    private static final Format INTERVAL_FORMAT = 
        new Format("HH:mm:ss.SSS", "GMT+0");

    /** 将日期转化为字符串(yyyy-MM-dd HH:mm:ss.SSS) **/
    public static String dateToString(Date date) {
        return DATE_LONG_FORMAT.getFormat().format(date);
    }
    /** 将日期转化为字符串(yyyy-MM-dd HH:mm:ss.SSS) **/
    public static String dateToString(long date) {
        return DATE_LONG_FORMAT.getFormat().format(new Date(date));
    }
    /** 将日期转化为字符串(yyyy-MM-dd HH:mm:ss) **/
    public static String dateToNormal(Date date) {
        return DATE_TIME_FORMAT.getFormat().format(date);
    }
    /** 将日期转化为字符串(yyyy-MM-dd HH:mm:ss) **/
    public static String dateToNormal(long date) {
        return DATE_TIME_FORMAT.getFormat().format(new Date(date));
    }
    /** 将时间转化为字符串(HH:mm:ss.SSS) **/
    public static String timeToString(Date time) {
        return TIME_LONG_FORMAT.getFormat().format(time);
    }
    /** 将时间转化为字符串(HH:mm:ss.SSS) **/
    public static String timeToString(long time) {
        return TIME_LONG_FORMAT.getFormat().format(new Date(time));
    }
    /** 将时间转化为字符串(HH:mm:ss) **/
    public static String timeToNormal(Date time) {
        return TIME_FORMAT.getFormat().format(time);
    }
    /** 将时间转化为字符串(HH:mm:ss) **/
    public static String timeToNormal(long time) {
        return TIME_FORMAT.getFormat().format(new Date(time));
    }
    /**
     * 解析日期字符串
     * @param date String 日期字符串
     * @return Date 日期对象
     * @throws IllegalArgumentException 日期格式错误
     */
    public static Date dateValueOf(String date) throws IllegalArgumentException {
        if(Validator.isNull(date)) {
            throw new IllegalArgumentException("日期格式错误:[null]");
        }
        try {
            return _parseDate(date);
        } catch(ParseException e) {
            throw new IllegalArgumentException("日期格式错误:[" + date + "]");
        }
    }
    /**
     * 解析日期字符串, 解析失败返回null<br>
     * @param date String 日期字符串
     * @return Date 日期对象, 解析失败返回null
     */
    public static Date parseDate(String date) {
        if(Validator.isNull(date)) return null;
        try {
            return _parseDate(date);
        } catch(ParseException e) {
            return null;
        }
    }
    private static Date _parseDate(String date) throws ParseException {
        if(date.indexOf('.') != -1)
            return DATE_LONG_FORMAT.getFormat().parse(date);
        else if(date.indexOf(':') != -1)
            return DATE_TIME_FORMAT.getFormat().parse(date);
        else
            return DATE_FORMAT.getFormat().parse(date);
    }

    /**
     * 解析时间字符串
     * @param time String 时间字符串
     * @return Date 日期对象
     * @throws IllegalArgumentException 时间格式错误
     */
    public static Date timeValueOf(String time) throws IllegalArgumentException {
        try {
            return _parseTime(time);
        } catch(ParseException e) {
            throw new IllegalArgumentException("时间格式错误:[" + time + "]");
        }
    }
    /**
     * 解析时间字符串, 解析失败返回null<br>
     * @param time String 时间字符串
     * @return Date 日期对象
     */
    public static Date parseTime(String time) {
        try {
            return _parseTime(time);
        } catch(ParseException e) {
            return null;
        }
    }
    private static Date _parseTime(String time) throws ParseException {
        if(time.indexOf('.') != -1)
            return TIME_LONG_FORMAT.getFormat().parse(time);
        else
            return TIME_FORMAT.getFormat().parse(time);
    }

    /**
     * 格式化间隔时间(dDays HH:mm:ss.SSS)
     * @param interval long 间隔时间
     * @return String
     */
    public static String formatInterval(long interval) {
        // 时分秒毫秒
        String result = INTERVAL_FORMAT.getFormat().format(new Date(interval));
        // 天
        long day = interval / 86400000;
        if(day > 0) { // 大于1天, dDays HH:mm:ss.SSS
            result = day + (day == 1 ? "Day " : "Days ") + result;
        } else { // 小于1天, HH:mm:ss.SSS
            return result;
        }
    }

    /**
     * 获取以字符串形式表示的间隔时间(dDays HH:mm:ss.SSS)
     * @param start long
     * @param end long
     * @return String
     */
    public static String getInterval(long start, long end) {
        if(start > end) {
            long temp = start;
            start = end;
            end = temp;
        }
        return formatInterval(end - start);
    }

    /**
     * 获取以字符串形式表示的间隔时间(dDays HH:mm:ss.SSS)
     * 指定时间与当前时间的间隔
     * @param start long
     * @return String
     */
    public static String getInterval(long start) {
        return getInterval(start, System.currentTimeMillis());
    }

    /**
     * 获取以字符串形式表示的间隔时间(dDays HH:mm:ss.SSS)
     * @param start Date
     * @param end Date
     * @return String
     */
    public static String getInterval(Date start, Date end) {
        return getInterval(start.getTime(), end.getTime());
    }

    /**
     * 获取以字符串形式表示的间隔时间(dDays HH:mm:ss.SSS)
     * 指定时间与当前时间的间隔
     * @param start Date
     * @return String
     */
    public static String getInterval(Date start) {
        return getInterval(start.getTime(), System.currentTimeMillis());
    }

    /**
     * 判断日期是否已经过期
     * @param date
     * @return
     */
    public static boolean isOverdue(String date) {
        try {
            return dateValueOf(date).getTime() < System.currentTimeMillis();
        } catch(Exception e) {
            return false;
        }
    }

    /**
     * 判断当前时间是否在开始时间与结束时间之间<br>
     * 以大于等于开始时间且小于结束时间作判断<br>
     * 如果结束时间没有时间部分, 则默认为包括当天的全部时间段
     * @param start 开始时间
     * @param end 结束时间
     * @return
     */
    public static boolean in(String start, String end) {
        return in(start, end, (Date)null);
    }

    /**
     * 判断指定时间是否在开始时间与结束时间之间<br>
     * 以大于等于开始时间且小于结束时间作判断<br>
     * 如果结束时间没有时间部分, 则默认为包括当天的全部时间段
     * @param start 开始时间
     * @param end 结束时间
     * @param dest 指定时间
     * @return
     */
    public static boolean in(String start, String end, String dest) {
        Date destDate = dest == null ? new Date() : dateValueOf(dest);
        return in(start, end, destDate);
    }

    /**
     * 判断指定时间是否在开始时间与结束时间之间<br>
     * 以大于等于开始时间且小于结束时间作判断<br>
     * 如果结束时间没有时间部分, 则默认为包括当天的全部时间段
     * @param start 开始时间
     * @param end 结束时间
     * @param dest 指定时间
     * @return
     */
    public static boolean in(String start, String end, Date dest) {
        Date startDate = dateValueOf(start);
        Date endDate = dateValueOf(end);
        if(dest == null) dest = new Date();
        long startTime = startDate.getTime();
        long endTime = endDate.getTime();
        long destTime = dest.getTime();
        // 如果结束时间没有时间部分, 则默认为包括当天的全部时间段
        // 以小于下一天的最小时间计算
        if(end.indexOf(':') == -1) endTime += 24 * 60 * 60 * 1000;
        return destTime >= startTime && destTime < endTime;
    }

    /** 本地时间与UTC的差值, UTC(通用协调时, Universal Time Coordinated) **/
    private static final long UTC = TimeZone.getDefault().getOffset(0);
    /** 一天的毫秒数 **/
    private static final long DAY = 24 * 60 * 60 * 1000L;
    /** 指定时间是否为同一天 **/
    public static boolean isSameDay(long one, long two) {
        // 时间毫秒数+UTC差值=本地时间
        return (one + UTC) / DAY == (two + UTC) / DAY;
    }
    /** 指定时间是否为同一天 **/
    public static boolean isSameDay(Date one, Date two) {
        return isSameDay(one.getTime(), two.getTime());
    }
    /** 指定时间是否为当天 **/
    public static boolean isToday(long date) {
        return isSameDay(date, System.currentTimeMillis());
    }
    /** 指定时间是否为当天 **/
    public static boolean isToday(Date date) {
        return isSameDay(date.getTime(), System.currentTimeMillis());
    }

    /** 解决SimpleDateFormat线程不安全的问题 **/
    private static class Format extends ThreadLocal {
        private String pattern;
        private String timeZone;
        public Format(String pattern) {
            this.pattern = pattern;
        }
        public Format(String pattern, String timeZone) {
            this.pattern = pattern;
            this.timeZone = timeZone;
        }
        protected synchronized Object initialValue() {
            SimpleDateFormat format = new SimpleDateFormat(pattern);
            if(timeZone != null) {
                format.setTimeZone(TimeZone.getTimeZone(timeZone));
            }
            return format;
        }
        public SimpleDateFormat getFormat() {
            return (SimpleDateFormat)get();
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值