网上关于获取当天零点时间戳,很多都提到了一个效率很高的算法:
long now = System.currentTimeMillis();
long daySecond = 24L * 60 * 60 * 1000; // 一天的毫秒值
long dayTime = now - (now + TimeZone.getDefault().getRawOffset()) % daySecond;
// TimeZone.getDefault().getRawOffset() 方法用于获取以毫秒为单位的时间量添加到UTC在这个时间段获得的标准时间
// 如果是在中国(东八区:UTC+8),就等于 8 * 60 * 60
一起来理解一下:
- 大家应该都知道,时间戳是从1970年1月1日的0点开始的。在网上找一个时间戳转换工具,可以看到,
0
时间戳对应的是1970年1月1日的8点,因为我们处在东八区,实际上时间戳是从我们(东八区)1970年1月1日的8点开始的,也就是格林尼治在那天的0点。(拓: 所以,全世界某一时刻的时间戳都是同一个值,只是在转换为我们看到的时间格式时加减上了时区的值)
now - ( now + 8 * 60 * 60 * 1000) % daySecond
,表示的是用此刻的时间戳,减去此刻到0点的毫秒差,从而得到当天0点的时间戳。- 即
( now + 8 * 60 * 60 * 1000) % daySecond
表示此刻到0点的毫秒差。8*60*60
是八个小时,now
是从1970年1月1日8点到现在的毫秒值,相加得到1970年1月1日0点到现在的毫秒值,用这个值,取余一天的毫秒值,得到的就是当天零点到此刻的毫秒值
😁欢迎加入QQ群交流: [游戏-Web-开发技术栈 ☄️] '300567032’
点击下方图标一键加入!