我住在斯里兰卡。我有这段代码来记录无效登录时的当前日期和时间。
$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('亚/科伦玻&#39);
使用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') )";
答案 0 :(得分:3)
英格兰的此服务器可能正在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
列之前,会将时间缩短到当地时间。< / p>
混淆?是。