0
点赞
收藏
分享

微信扫一扫

JAVA优化篇3-判断两个Date是否相等(高并发下优化Calendar)

夏侯居坤叶叔尘 2021-09-21 阅读 30

1. 对Calendar的优化

Calendar是线程不安全的,不能放在全局变量中使用,但是每次都要new一个Calendar对象,可能会影响性能。

在[Jackson序列化(4)— Jackson“默认的”时间格式化类—StdDateFormat解析里面,我们可以得知一种优化方案:使用clone来创建对象

public class Test{
    //北京时间
    protected final static TimeZone DEFAULT_TIMEZONE = TimeZone.getTimeZone("GMT+08:00");
    //中国大陆
    protected final static Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE;
    /**
     * 它是线程不安全的,不能直接使用,但是使用clone可以更高效的创建Calendar对象
     */
    protected static final Calendar CALENDAR = new GregorianCalendar(DEFAULT_TIMEZONE, DEFAULT_LOCALE);

    public static void main(String[] args) {
        
        Calendar c1 = (Calendar) CALENDAR.clone();
        c1.setTime(new Date());

        Calendar c2 = (Calendar) CALENDAR.clone();
        c2.setTime(new Date());
        c2.add(Calendar.DAY_OF_MONTH,1);

        boolean sameDay = DateUtils.isSameDay(c1, c2);
        System.out.println(sameDay);
    }
}

2. 比较两个Date时间是否相等

org.apache.commons.lang3.time.DateUtils#isSameDay(java.util.Calendar, java.util.Calendar)源码

public class DateUtils {
    public static boolean isSameDay(final Calendar cal1, final Calendar cal2) {
        if (cal1 == null || cal2 == null) {
            throw new IllegalArgumentException("The date must not be null");
        }
        return cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) &&
                cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
                cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);
    }
}

Calendar.ERA:定义了两个字段:AD和BC。这些代表公历定义的两个时代。来判断两个日期是否是同一个世纪。
Calendar.YEAR:来判断两个日期是否是同一年。
Calendar.DAY_OF_YEAR:来判断两个日期是否是同一年中的同一天。

3. 获取昨天和明天的时间

    public static void main(String[] args) {
        //该方式是new的方式,可以使用clone的方式获取到对象。
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        //增加一天,减少一天为-1
        c.add(Calendar.DAY_OF_MONTH, 1);
        //设置时分秒(0时0分0秒)
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        Date time = c.getTime();
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time));
    }

可以借助Calendar的add方法来增加时间,可以使用set方法来设置时间。

举报

相关推荐

0 条评论