获取当天零点的时间戳 `now - ( now + 8 * 60 * 60) % daySecond` 的解释

网上关于获取当天零点时间戳,很多都提到了一个效率很高的算法:

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

一起来理解一下:

  1. 大家应该都知道,时间戳是从1970年1月1日的0点开始的。在网上找一个时间戳转换工具,可以看到,0时间戳对应的是1970年1月1日的8点,因为我们处在东八区,实际上时间戳是从我们(东八区)1970年1月1日的8点开始的,也就是格林尼治在那天的0点。(拓: 所以,全世界某一时刻的时间戳都是同一个值,只是在转换为我们看到的时间格式时加减上了时区的值)
    在这里插入图片描述
  2. now - ( now + 8 * 60 * 60 * 1000) % daySecond,表示的是用此刻的时间戳,减去此刻到0点的毫秒差,从而得到当天0点的时间戳。
  3. ( now + 8 * 60 * 60 * 1000) % daySecond表示此刻到0点的毫秒差。8*60*60是八个小时,now是从1970年1月1日8点到现在的毫秒值,相加得到1970年1月1日0点到现在的毫秒值,用这个值,取余一天的毫秒值,得到的就是当天零点到此刻的毫秒值

😁欢迎加入QQ群交流: [游戏-Web-开发技术栈 ☄️] '300567032’
点击下方图标一键加入!
游戏-Web-开发技术栈 ☄


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值