关于php:如何在mysql datetime列中存储时区信息的时间?

How to store time with timezone infomation in mysql datetime column?

本问题已经有最佳答案,请猛点这里访问。

目前,我有来自shopify api(2018-12-16T17:36:29 + 11:00)的时间戳,我需要存储在mysql的datetime字段中。

第一个问题:

到底是什么2018-12-16T17:36:29 + 11:00意味着什么?

日期:2018-12-16,

时间:17:36:29,

时区:+11:00 ?????

第二个问题:

如果我想将时间戳存储到mysql datetime列中。
我收到这个错误

1
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2018-12-16T17:36:29+11:00' for column 'shopify_created_at' at row 1

使用时区信息存储时间的正确方法是什么?


What exactly 2018-12-16T17:36:29+11:00 means?

这是UTC偏移时间戳,因此您有:

1
2
3
UTC Date: `2018-12-16`
UTC Time: `17:36:29`
Offset: `+11:00`

我不熟悉Shopify及其API,但是,如果知道/存储时区很重要,我会将UTC时间存储在数据库的一列中(使用datetime fieldtype),将偏移时间存储在另一列中柱。

例:

1
2
3
|    Date                  |   Timezone  |
==========================================
|    2018-12-16 17:36:29   |   +11       |

这样,您现在可以在所需的时区获得准确的时间。例:

1
2
$strtime = $record['Date'].' '.$record['Timezone']' hours';
echo date('Y-m-d H:i:s', strtotime($strtime));

timezone:+11:00 = UTC + 11:00是UTC的+ 11小时时间偏移量的标识符。此时间用于:北亚,澳大利亚和其他一些国家。

至于时间戳,你可以简单地使用:

1
2
3
$time = '2018-12-16T17:36:29+11:00';
$created = date('Y-m-d H:i:s', strtotime($time)); //result: 2018-12-16 09:36:29
$update ="UPDATE db.table SET shopify_created_at='".$created."' WHERE id=X";


我不熟悉shopify,但它看起来像UTC偏移,所以它将是:

1
2
3
date: 2018-12-16,
time: 06:36:29,
timezone: UTC+11:00

至于你的第二个问题,你没有:

MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.

所有时间戳都是无时区的。您可以单独保存时区,也可以将其保存为字符串。最好的方法是通过从时钟中减去时区来转换2018-12-16T17:36:29+11:00字符串,然后分别保存2018-12-16T06:36:29+11:00。如果您不需要时区参考以供进一步使用,您可以标准化时间并丢弃TZ规范。

此外,根据您的需要,您可能会做两件事。规范化时间戳将有助于以可靠的方式进行排序,TZ免费,而如果您需要其他shopify查询,则可以存储和检索完整的字符串。