某些功能需要用到,比如判断刷新时间,等等。
这个网址的第二种解决方案是有问题的,不要用。
参考:https://www.cnblogs.com/cc-java/p/6699045.html
如果你百度“java获取今日0点”,第一个结果很可能就是上面的博客。但是博客给出解决方案二是有问题的,在0至8点的时间会失效,坑爆!而且博主也没有任何要修改的意思,需要特别注意。
一、解决方案
(1)使用Calendar
看了前人写的工具类,也是这样写的:
1 2 3 4 5 6 7 8 9 10 11 |
public static long getDayStartMillis(long milliTime) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(milliTime); 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(); } |
这种写法的思路是:设置一个calendar对象,默认是现在时间,然后设置时间为milliTime,逐一设置0天0时0分0秒0毫秒属性,最后得出来的就是今天的0点。
逐一输出看看功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public static long getDayStartMillis(long milliTime) { Calendar calendar = Calendar.getInstance(); System.out.println(calendar.getTime()); // Wed Jan 10 19:57:25 CST 2018 calendar.setTimeInMillis(milliTime); System.out.println(calendar.getTime()); // Wed Jan 10 19:57:25 CST 2018 calendar.set(Calendar.HOUR_OF_DAY, 0); System.out.println(calendar.getTime()); // Wed Jan 10 00:57:25 CST 2018 calendar.set(Calendar.MINUTE, 0); System.out.println(calendar.getTime()); // Wed Jan 10 00:00:25 CST 2018 calendar.set(Calendar.SECOND, 0); System.out.println(calendar.getTime()); // Wed Jan 10 00:00:00 CST 2018 calendar.set(Calendar.MILLISECOND, 0); System.out.println(calendar.getTime()); // Wed Jan 10 00:00:00 CST 2018 return calendar.getTimeInMillis(); } |
顺带一提,创建Calendar的时候最好设置时区:
1 |
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); |
否则在linux下,可能会遇到时区问题,和windows下结果不一样,这个也很坑。
(2)直接使用时间戳(有坑)
错误示例:
1 2 3 4 5 6 7 |
public static long getDayStartMillis() { long current = System.currentTimeMillis(); long zero = current / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset(); return zero; } |
至于这代码的思路,我看不太出来想表达什么…
有评论者指出,如果你使用这段代码获取时间,会在每天0-8点这个时段遇到问题。他给的解决方案是这样的:
1 2 3 4 5 6 7 |
public static long getDayStartMillis() { long current = System.currentTimeMillis(); long zero = (current + TimeZone.getDefault().getRawOffset()) / (1000 * 3600 * 24) * (1000 * 3600 * 24); return zero; } |
我试了一下,这样是正确的!可以一用。
二、总结
个人认为最好的解决方案还是方案一,比较直观。
因为这些方法都是可以复用的,最好写成静态方法,弄成一个工具类。