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