openresty关于时区的处理

假如时间戳是86400,距离1970-01-01 00:00:00 过了一天

转换关系如下

格林威治时间是1970-01-02 00:00:00 , 格林威治是0时区

北京时间是 1970-01-02 08:00:00 北京东8区,所以日期需要加8*3600秒显示北京时间

纽约时间是 1970-01-01 20:00:00 纽约西5区,显示日期需要减5*3600秒显示纽约时间

纽约夏时令问题

本来北京比纽约早13个小时,我们早晨八点时他们还是昨天完成21点

但是纽约人节约能源,充分利用太阳光,约定每年3月第二个周日–11月第一个周日每天,都把时间调早一个小时,早点起床工作学习【这样就和我们差了12个时区,成了西4区】, 其余时间按标准的西5区。

如何在本时区计算其他时区的时间

一般系统函数处理时间,都自带时区,比如

os.date("%Y%m%d %H%M%S", os.time()) // 2022-09-18 08:00:00

os.time()时间戳任何国家同一时刻结果都一样,但是os.date函数会自动加上当前的时区

如果还是os.date, 服务器时区设置的是东八区,那么去纽约时间需要减去12小时(夏令时范围内)

os.date("%Y%m%d %H%M%S", os.time - 3600*12) // 2022-09-17 20:00:00

通过时间戳的修改,抵消os.date加上的时区

获取其他时区的0点时间戳

为什么要获取其他时区的0点时间戳这个需求呢?

假如你从某天气数据源获取其他时区的天气数据json格式的,对方给的是带时区的日期格式 2022-09-18 05:00T-04:00(纽约市),
这个时间是当地时间5点的数据,后面标了时区西4区, 你需要判断这个数据是否有效,如果你计算的对方的时间是 2022-09-18 09:00 , 都9点了,这个数据肯定没用了,如何比较呢

当然知道和北京的时区差,可以用os.date 计算当地时间,和这个json时间比较

也可以计算当地时间所在天过去了多少秒, 然后求得当天0点的时间戳,再比较

北京当天过去了 (os.time() + 8 * 3600) % 86400 为X秒, 0点时间戳 os.time() - X

纽约当天过去了 (os.time() - 4 * 3600) % 86400 为Y秒, 0点时间戳 os.time() - Y

计算0点时间戳是因为判断数据源的有效性是通过比较数据的日期是否大于当天0点的日期,大于的才需要保留,否则认为是过期的数据就舍弃。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值