我应使用哪种类型在UTC中存储当前日期和时间?
然后能够将UTC日期转换为特定时区吗?
现在我使用TIMESTAMP
类型和CURRENT_TIMESTAMP
。
它存储数据,例如:2019-08-19 20:44:11
但是分钟数与实际UTC时间不同,我不知道为什么。
我的服务器时间是本地的。在Windows Server下是正确的
答案 0 :(得分:2)
由您决定在用户和服务器具有不同区域设置时解决时区问题的最佳方法。
无论大小写和应用程序(手机,网络等)如何,问题都是相同的。您应该以自己的方式找到最好和最容易的方式来处理时区。
您可以使用以下几种选择:
MySQL
在MySQL Date and Time Types中-您可以创建用于保存日期和时间值的表字段。
“用于表示时间值的日期和时间类型为DATE,TIME,DATETIME,TIMESTAMP和YEAR。每种时间类型都有一个有效值范围以及一个“零”值,当您指定时MySQL无法代表的无效值。TIMESTAMP类型具有特殊的自动更新行为,稍后将进行说明。“
关于MySQL Data Type Storage Requirements,请阅读链接,并确保您满足项目中表存储引擎和类型要求。
通过以下方式在MySQL中设置时区:
SET time_zone ='+8:00'
对我来说,这还需要做很多工作,但是数据是完全由MySQL加载,管理和更新的。这里没有PHP!
使用MySQL似乎是一个更好的主意(这就是我想的想法),但是还有很多其他东西。
要进行选择,您必须做出明智的决定。关于使用MySQL的内容有很多。这是一个practical article,涉及使用MySQL管理日期,时间和时区的麻烦。
由于您没有指定数据库的接口方式,因此下面是一个PHP示例和用于处理日期,时间和时区的函数。
PHP
1。保存日期,时间和时区
例如芝加哥(美国-伊利诺伊州)-UTC偏移UTC -5小时 您可以保存日期时间
2015-11-01 00:00:00
和时区
美国/芝加哥
您将不得不计算出DST过渡和具有不同天数的月份。
这里引用了DateTime来计算出任何时区和DST差异:
2。 Unix时间戳和时区
在进入此选项的详细信息之前,我们应该了解以下内容:
unix时间戳是一种跟踪时间(以秒为单位)的方式。此计数从1970年1月1日UTC的Unix Epoch开始。因此,unix时间戳仅仅是特定日期与Unix纪元之间的秒数。还应指出(由于来自此站点的访问者的评论),无论您身在何处,该时间点在技术上都不会改变。这对于计算机系统在在线和客户端动态和分布式应用程序中跟踪和排序日期信息非常有用。
2038年1月19日会发生什么?
在这一天,由于32位溢出,Unix时间戳将停止工作。在此之前,数百万应用程序将需要采用新的时间戳约定,或迁移到64位系统,这将使时间戳花费更多的时间。
以下是时间戳的工作方式:
2019/08/19 @下午8:59 (UTC)转换为 1970年1月1日以来的 1566248380 秒。(UTC)
使用PHP date()函数,您可以将其格式化为所需的任何格式:
回显日期('L jS \ of F Y h:i:s A', 1566248380 );
2019年8月19日星期一08:59:40 PM
或MySQL:
SELECT from_unixtime(2147483647);
+ -------------------------------------- +
| from_unixtime(2147483647)|
+ -------------------------------------- +
| 2038-01-19 03:14:07 |
+ -------------------------------------- +
更多示例格式可以转换为:
2019年8月19日下午8:59(UTC)
ISO 8601中的2019-08-19T20:59:40 + 00:00
2019年8月19日星期一20:59:40 +0000在RFC 822、1036、1123、2822中
RFC 2822中的UTC星期一,19年8月19日20:59:40
RFC 3339中的2019-08-19T20:59:40 + 00:00
PHP Date()函数可以用作参考。
同样,您必须保存时区:
美国/芝加哥
使用date_default_timezone_set()函数为用户设置PHP脚本时区:
//设置要使用的默认时区。自PHP 5.1起可用
date_default_timezone_set('UTC');
date_default_timezone_set('美国/芝加哥');
答案 1 :(得分:1)
您无法存储带有时区信息的日期/时间。
MySQL不在DATETIME
或TIMESTAMP
上存储时区信息。假定它们位于服务器时区。
唯一的麻烦解决方法是将整个MySQL服务器/ vm / docker容器设置为UTC。