我很难理解计算日期/时间差时哪里出了问题.这似乎源于时区差异,但尚不清楚问题出在哪里.以下是所有作品.我哪里做错了?谢谢!

我判断了mysql时区:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

我的本地系统是macOS,日期时间设置为正确的本地时间和哥本哈根时区(CEST).

我有一个mysql数据库,其字段指定为:

token_time_utc DATETIME DEFAULT NULL

然后我使用NodeJS和mysql 2连接器填充该字段:

'UPDATE `account` SET token = ?, token_time_utc = UTC_TIMESTAMP() WHERE user_id = ?', [token, account.user_id] ...

然后我发送一封带有令牌的邮箱,并try 在6分钟内验证它,但失败了:

// did they verify token within 6 minutes UTC time?
let sixMins = (60 * 1000 * 6);
let tokenTime = account.token_time_utc.getTime();
let tokenExpiration = tokenTime + sixMins;
let now = new Date().getTime();
console.log('Account timestamp: ' + account.token_time_utc + ' Token time: ' + tokenTime + ' Token expiration: ' + tokenExpiration + ' Now: ' + now
    + ' Diff: ' + (now - tokenTime) + ' Diff (minutes): ' + ((now - tokenTime) / 1000 / 60));
if (now > tokenExpiration) {
    // return error
    res.status(401).json({ message: 'Token timed out' });
    return;
}

以下是记录到控制台的内容:

Account timestamp: Tue May 07 2024 07:25:52 GMT+0200 (Central European Summer Time) Token time: 1715059552000 Token expiration: 1715059912000 Now: 1715066768248 Diff: 7216248 Diff (minutes): 120.2708

这一切都在我的机器上本地运行.我跑的时间是哥本哈根上午9:25,目前是GMT+2.收到邮箱并放入 token 不到一分钟,120分钟的差异似乎是因为时区不正确.我试图将所有内容保持在UTC,DB存储了与我相比正确的UTC时间(上午7:25),但它被注释到CEST,即哥本哈根(这很奇怪?).

当我向DB提交时间时,UTC_TIMESTMP()命令要求使用当前时间作为UTC存在问题吗?或者accounts.token_time_utc.getTime()的操作是否错误?或者我只是搞砸了JS Date方法的使用?

或者我需要设置mysql时区吗?我看到了这些帖子,但不确定这是否就是问题所在: Should MySQL have its timezone set to UTC? How do I set the time zone of MySQL?

推荐答案

出现错误是因为Date.now()new Date()添加了相对于dev的时区偏差/差异(如果时间戳上没有提供其他信息,则为process.env.TZ),而UTC_TIMESTAMP()忽略了时区.存储时应该使用CURRENT_TIMESTAMP()set the node server TZ to UTC too.

mplungjan comments 将Z添加到token_time_utc也有效.

您还可以使用Date.UTC()并将UTC时间戳中的部分传递给它.

这应该是类似于:

const [str, year, month, day, hour, minute, seconds, ms] = 
  '2003-08-14 18:08:04.123'.match(
    /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})\.?(\d+)?$/
  )
console.log(
  new Date(Date.UTC(year, month -1, day, hour, minute, seconds, ms)).toLocaleString()
)

Javascript相关问答推荐

ChartJS:分组堆叠条形图渲染错误

使用JavaScript/PHP将二维码保存为服务器端的图像

如何从defineExpose访问数据和方法

添加/删除时React图像上传重新渲染上传的图像

为什么getRecord()会因为与_logger相关的错误而失败?(使用Hedera SDK)

判断表格单元格中是否存在文本框

将本机导航路由react 到导航栏中未列出的屏幕?

html + java script!需要帮助来了解为什么我得到(无效的用户名或密码)

我怎么才能得到Kotlin的密文?

如何控制Reaction路由加载器中的错误状态?

Angular 订阅部分相互依赖并返回数组多个异步Http调用

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

未定义引用错误:未定义&Quot;而不是&Quot;ReferenceError:在初始化&Quot;之前无法访问';a';

IF语句的计算结果与实际情况相反

如何将未排序的元素追加到数组的末尾?

覆盖加载器页面避免对页面上的元素进行操作

匹配一个或多个可选重复的特定模式

postman 预请求中的hmac/sha256内标识-从js示例转换

如何通过Axios在GraphQL查询中发送数组

不协调嵌入图片