我住在斯里兰卡。我有这段代码来记录无效登录时的当前日期和时间。
$insert_query = "INSERT INTO LoginAttempt(IpAddress, LoginAt) VALUES('". $_SERVER['REMOTE_ADDR']. "', CURRENT_TIMESTAMP)";
我已上传到 Hostinger.co.uk,这是用于教育目的的免费网络托管服务。
成功插入表。它显示日期正确。但时间比实际时间少了约5小时30分钟。 有没有办法在 cPanel 中或以编程方式在 PHP 脚本中更改时区?
我尝试过的;
1) 添加此内容。但不起作用! date_default_timezone_set('亚洲/科伦坡');
使用DATE_ADD
函数添加特定缺失时间的另一个解决方案。
您还有什么想法?谢谢
MySQL 表;
CREATE TABLE LoginAttempt(
LoginId INT NOT NULL AUTO_INCREMENT,
IpAddress VARCHAR(20) NOT NULL,
LoginAt DATETIME NOT NULL DEFAULT NOW(),
PRIMARY KEY(LoginId)
);
有效的解决方案!!!
$insert_query = "INSERT INTO LoginAttempt(IpAddress, LoginAt) VALUES('". $_SERVER['REMOTE_ADDR']. "', CONVERT_TZ(NOW(), 'UTC', 'Asia/Colombo') )";
最佳答案
英格兰的这台服务器可能以 UTC 时间运行。斯里兰卡比 UTC 早 5:30,这并非巧合。您的服务器肯定会在您的表中记录正确的时间。它只是在错误的区域。
这些操作共享服务器的人不会仅仅为了您而改变这一点:您与来自世界各地的人们共享服务器。 (请注意,在任何地方都以 UTC 时间运行服务器被认为是一种良好的做法,因此,如果您的服务器位于大厅下方,您也会遇到同样的问题。)
将 LoginAt
列的数据类型从 DATETIME
更改为 TIMESTAMP
。 TIMESTAMP
值始终以 UTC 格式记录,并在显示时始终转换为本地时间。
然后,每当您连接到 MySQL(从程序或在 PhpMyAdmin 中)时,发出
SET time_zone = 'Asia/Colombo'
在执行其他操作之前,您已经发现了命令。然后您将看到以本地时间显示的 TIMESTAMP
数据。
或者,如果您知道现有的 DATETIME
或 DATE
时间数据是根据 UTC 记录的,则可以 convert it in MySQL using CONVERT_TZ()
。例如,
SELECT CONVERT_TZ(LoginAt, 'UTC', 'Asia/Colombo') LoginAt, ...
将在本地时间为您提供信息。
需要知道的是 TIMESTAMP
数据类型、NOW()
、CURDATE()
、CURRENT_TIMESTAMP
使用时区设置检索等等。 DATETIME
和 DATE
不是。因此,您的程序获取 CURRENT_TIMESTAMP
隐式将其转换为 UTC 本地时间,并将其存储到您的 DATETIME
列中,从而将时间凝结为 UTC。
如果您的程序将其存储到 TIMESTAMP
列中,则存储时间的时区不会被卡住。或者,如果您的程序在问题中发出查询之前发出set time_zone = 'Asia/Colombo'
命令,它会将时间凝结为您的本地时间,然后再存储进入您的 DATETIME
列。
令人困惑?是的。
关于PHP mySQL CURRENT_TIMESTAMP cPanel 数据库中显示的时间不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38027782/