为什么js的 timestamp 与 php里的长度不一样

今天在写一个 wechat 的相关功能发现这个问题
更新于: 2023-08-12 08:37:16

背景

今天在实现微信 jssdk 的签名验证,看到了这段代码,因为官网里给出的是 php 版本,并没有这个 1000 的逻辑。

const getTimestamp = () => {
  return parseInt((Date.now() / 1000).toString(), 10);
};

时间戳

js 里的 timestamp 实际逻辑

  1. 现在的时间: 2023-08-11 22:36:10
  2. 1970年00时00分00秒
const current = new Date("2023-08-11 14:30:15");
const start = new Date('1970-01-01 00:00:00');

const ctime = current.getTime();
const stime = start.getTime();

// 这个就是 Date.now() 的逻辑
const timestamp = ctime - stime;

东8区

我所在的是东8区,new Date('1970-01-01 00:00:00').getTime() 得到 -28800000 ms

如果你处于东八区(UTC+8),那么当你获取一个早于 UTC 时间的日期时,由于时区的影响,你得到的时间戳可能是负数。东八区的时间比 UTC 时间快 8 小时,因此如果你获取了 UTC 基准时间之前的时间,会得到负数的时间戳。

要在 JavaScript 中正确处理时区问题,你可以使用 new Date() 构造函数,并提供本地日期时间的参数。这样,JavaScript 会自动将本地时间转换为 UTC 时间,然后计算时间戳。
// 貌似这是一个时区的算法 --> 8
const stdDate = new Date('1970-01-01 00:00:00')
const timestamp = stdDate.getTime()
const hours = timestamp/1000/60/60;

From ChatGPT

JavaScript 和 PHP 在处理时间戳(timestamp)时可能会有不同的长度,这是由于它们在时间戳的表示方式以及精度上的差异所导致的。

JavaScript 时间戳通常是以毫秒(ms)为单位的,表示自 1970 年 1 月 1 日(UTC)以来的毫秒数。在 JavaScript 中,可以使用 `Date.now()` 或 `new Date().getTime()` 来获取当前的时间戳,得到的结果是一个长度为 13 位的时间戳(例如:1628678775123)。

而 PHP 默认情况下使用整数来表示秒数,自 1970 年 1 月 1 日(UTC)以来的秒数。你可以使用 `time()` 函数获取当前的时间戳,得到的结果是一个长度为 10 位的时间戳(例如:1628678775)。

如果你在 PHP 中需要以毫秒为单位的时间戳,可以使用 `microtime(true) * 1000` 来获取一个长度为 13 位的时间戳。这会返回当前时间的浮点数表示,乘以 1000 就可以得到毫秒级的时间戳。

所以,不同的时间戳长度是因为 JavaScript 和 PHP 在默认表示方式以及精度上的差异造成的。在进行时间戳处理时,你需要根据具体的需求来选择合适的方法和精度。

参考