• 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
    
    • 1

    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
    
    • 1

    通过时间戳的修改,抵消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点的日期,大于的才需要保留,否则认为是过期的数据就舍弃。

  • 相关阅读:
    浏览器架构
    Flink作业执行之 2.算子 StreamOperator
    数据结构之顺序表
    【JUC系列-15】深入理解CompletableFuture的基本使用
    LCR 127.跳跃训练
    【MicroPython ESP32】machine.Pin类函数以及参数详解
    idea Springboot 校园助学贷款系统VS开发mysql数据库web结构java编程计算机网页源码maven项目
    【重温基础算法】内部排序之快速排序法
    开源Excel 处理工具库MyExcel介绍以及简单例子
    保姆级qt开发环境配置
  • 原文地址:https://blog.csdn.net/l_vim11/article/details/126928491