PHP mySQL CURRENT_TIMESTAMP cPanel中数据库中显示的时间不正确

时间:2016-06-25 11:05:26

标签: php mysql

我住在斯里兰卡。我有这段代码来记录无效登录时的当前日期和时间。

$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') )";

1 个答案:

答案 0 :(得分:3)

英格兰的此服务器可能正在UTC时间运行。斯里兰卡,并非巧合,比UTC早5:30。您的服务器肯定会在您的表中记录正确的时间。它只是在错误的区域。

这些操作共享服务器的人不会仅仅为您改变:您与来自全球各地的人共享服务器。 (请注意,在UTC时间到处运行服务器被认为是一种良好的做法,因此如果您的服务器位于大厅内,您将遇到同样的问题。)

LoginAt列的数据类型从DATETIME更改为TIMESTAMPTIMESTAMP值始终以UTC格式记录,并在显示时始终转换为本地时间。

然后,每当您连接到MySQL(从程序或PhpMyAdmin)时,发出

SET time_zone = 'Asia/Colombo'
在你做任何其他事情之前,你已经发现了

命令。然后,您会看到当地时间显示的TIMESTAMP数据。

或者,如果您知道的现有DATETIMEDATE时间数据是根据UTC记录的,则可以convert it in MySQL using CONVERT_TZ()。例如,

   SELECT CONVERT_TZ(LoginAt, 'UTC', 'Asia/Colombo') LoginAt, ...

会在当地时间向您提供您的信息。

要知道的是,使用时区设置检索TIMESTAMP数据类型,NOW()CURDATE()CURRENT_TIMESTAMP等。 DATETIMEDATE不是。因此,您的程序会将CURRENT_TIMESTAMP隐式转换为UTC本地时间,并将其存储到DATETIME列中,从而缩短UTC时间。

如果您的程序将其存储到TIMESTAMP列中,则存储时间的时区将不会凝结。或者,如果程序在您的问题中发出查询之前发出了set time_zone = 'Asia/Colombo'命令,那么在将其存储到DATETIME列之前,会将时间缩短到当地时间。< / p>

混淆?是。