收藏
回答

如何获取 UTC+0 时间的 Unix 时间戳?

我自己,加上 ChatGPT 一起,试了很多方法,都无法获取到 UTC+0 时间的 Unix 时间戳。

微信小程序是不是做了什么底层的修改啊?

唯一的接近的方法是「获取时区偏移的毫秒数」,然后相加或相减,但是在一些采用夏令时制度的地区,又会误差一小时。

我的时间戳用于签名的,这就导致其他一些地区的用户,生成的签名不正确,无法使用小程序。

回答关注问题邀请回答
收藏

1 个回答

  • Jie-T
    Jie-T
    2023-09-03

    修复了,用了笨办法。


    const now = new Date(); // 获取设备本地时间
    
    const timezoneOffsetInHours = now.getTimezoneOffset() / -60; // 获取时区偏移的小时数
    const utcTimezone = (timezoneOffsetInHours > 0 ? '+' : '') + timezoneOffsetInHours.toString(); // 获取 UTC 时区
    
    // 是否为夏令时
    function isDST() {
      const january = new Date(new Date().getFullYear(), 0, 1);
      const july = new Date(new Date().getFullYear(), 6, 1);
    
      return january.getTimezoneOffset() !== july.getTimezoneOffset();
    }
    
    let timeDiff = now.getTimezoneOffset() * 60 * 1000; // 获取时区偏移的毫秒数
    if (isDST()) {
      timeDiff += 60 * 60 * 1000; // 增加一个小时
    }
    
    const utcPositiveOffset = Math.floor(Date.now() + timeDiff); // 东区
    const utcNegativeOffset = Math.floor(Date.now() - timeDiff); // 西区
    let utcTimestamp = timezoneOffsetInHours > 0 ? utcPositiveOffset : utcNegativeOffset; // 获取 UTC+0 的 Unix 时间戳(毫秒级)
    if (timezoneOffsetInHours == 0) {
      utcTimestamp = Math.floor(Date.now() - 28800000); // 如果当前设备是 UTC+0 时区,微信写死了输出为东八区时间了
    }
    
    console.log('utcTimestamp', utcTimestamp);
    


    我现在有一个疑问。当用户本身就是 UTC+0 时区时,微信获取到的是 +8 时区的时间,这个是 bug 还是产品逻辑?后面不会改吧?

    2023-09-03
    有用
    回复
登录 后发表内容