使用MySQL将CURDATE()转换为我的本地日期


Converting CURDATE() to my local date with MySQL

我使用的是Godaddy的MySQL数据库。由于他们的时区是MSTUTC-7,我需要修改我的代码。当使用NOW()函数时,我发现了如何做到这一点。然而,我很难将CURDATE()的结果转换为我的本地日期。网站上的主题对它没有帮助。我没有特权更改mysql的时区,因为它是共享主机。CURDATE()的问题是,由于服务器和我所在的国家之间有10个小时的差异,所以在某些时候日期会有所不同。

到目前为止我尝试了什么

第一次尝试

SELECT convert_tz(CURDATE(),'-07:00','+03:00')

此查询在mysql中返回以下输出。

convert_tz(CURDATE(),'-07:00','+03:00')     
2016-05-14 10:00:00

我还没有尝试,因为日期仍然是一样的,但这段代码可能已经完成了工作。但问题在于约会之后的时间。CURDATE应只返回日期。我认为它返回了两个时区之间的差异,相当于10个小时,但我认为当我比较两个日期时会引起问题。

第二次尝试

SELECT convert_tz(CURDATE(),'MST','EEST');

由于服务器的时区是MST,而我的时区是EEST,所以我尝试了这种方式,但它返回NULL。

问题是,如果没有10:00:00,我应该怎么做才能返回日期。或者有更好的方法吗?

您的方法存在几个问题。

首先,CURDATE()返回一个日期,而不是日期时间。

其次,您需要将当前日期和时间从服务器的时区转换为您的时区,然后截断时间部分。这意味着在内部使用NOW(),而不是CURDATE()

第三,你需要使用正确的缩写来表示正确的时区,用于转换的两侧,用于全年。如果任一时区无法识别,则CONVERT_TZ()将返回NULL

在这种情况下,在MySQL时区表中,MST/MDT被称为"MST7MDT",而EET/EEST被称为"EET"。令人惊讶的是,Go Daddy没有将服务器时钟设置为UTC——这是服务器时钟的一种事实上的标准,但假设不是,"MST7MDT"可能是最正确的值。

mysql> SELECT DATE(CONVERT_TZ(NOW(),'MST7MDT','EET'));
+-----------------------------------------+
| DATE(CONVERT_TZ(NOW(),'MST7MDT','EET')) |
+-----------------------------------------+
| 2016-05-14                              |
+-----------------------------------------+
1 row in set (0.00 sec)

或者,您可以为时区使用更直观的本地化名称。我相信这些值也是正确的,可以正确地适应夏季和时间的变化:

mysql> SELECT DATE(CONVERT_TZ(NOW(),'America/Denver','Europe/Bucharest'));
+-------------------------------------------------------------+
| DATE(CONVERT_TZ(NOW(),'America/Denver','Europe/Bucharest')) |
+-------------------------------------------------------------+
| 2016-05-14                                                  |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

尝试使用CAST将日期转换为字符串,然后获取子字符串。

SELECT SUBSTRING_INDEX( CAST(CONVERT_TZ(CURDATE(),'-07:00','+03:00') AS char), ':', -1)

应返回

2016-05-14 10:00