零点时间

Posted by Codeboy on April 13, 2019

在一些按天计算的场景中,需要获取当天凌晨零点的时间,有什么快捷高效的做法呢?下面针对Java中的几种计算方式进行比较:

SimpleDateFormat

获取当前时间对应的年月日,反向计算即可。

private static long getTimeWay1() {
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
        return sdf.parse(sdf.format(System.currentTimeMillis())).getTime();
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return -1;
}

Calendar

使用 java.util.Calendar 类,可以便捷去除时分秒以及毫秒的数值,

private static long getTimeWay2() {
    Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
    //注意,这里不是Calendar.HOUR, 需要按照24小时的Calendar.HOUR_OF_DAY进行
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar.getTimeInMillis();
}

除法

借鉴 SimpleDateFormat 的方式,本次直接使用除法操作即可,需要注意一点的是时区问题,东八区相对于零时区增加了八个小时,处理中需要处理一下。

private static long getTimeWay3() {
    long ONE_DAY = 24 * 3600 * 1000;
    long now = System.currentTimeMillis();
    long offset = TimeZone.getDefault().getRawOffset();
    return (now + offset) / ONE_DAY * ONE_DAY - offset;
}

小结

方式 性能 使用
SimpleDateFormat 一般 一般
Calendar 方便
除法 最高 时区问题需要注意

对比下来, 推荐使用第二种

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。