在一些按天计算的场景中,需要获取当天凌晨零点的时间,有什么快捷高效的做法呢?下面针对Java中的几种计算方式进行比较:
获取当前时间对应的年月日,反向计算即可。
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; }
使用 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 | 高 | 方便 |
除法 | 最高 | 时区问题需要注意 |
对比下来, 推荐使用第二种
如有任何知识产权、版权问题或理论错误,还请指正。
转载请注明原作者及以上信息。