如何在mysql datetime列中存储时区信息?

31moq8wy  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(371)

这个问题在这里已经有答案了

如何使用时区信息在mysql中存储datetime(5个答案)
两年前关门了。
目前,我有来自shopifyapi(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列中。我得到这个错误

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

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

bkhjykvo

bkhjykvo1#

时区:+11:00=utc+11:00是从utc开始的+11小时时间偏移的标识符。这个时间用于:北亚,澳大利亚和其他一些国家。
至于时间戳,您可以简单地使用:

$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";
pb3s4cty

pb3s4cty2#

2018-12-16t17:36:29+11:00到底意味着什么?
这是utc偏移时间戳,因此您有:

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

我不熟悉shopify和它们的API,但是,如果知道/存储时区很重要,我会将utc时间存储在数据库的一列中(使用 datetime fieldtype)和另一列中的偏移小时数。
例子:

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

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

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

nxagd54h3#

我不熟悉shopify,但它看起来像utc偏移量,所以应该是:

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

至于你的第二个问题,你没有:
mysql将时间戳值从当前时区转换为utc进行存储,然后从utc转换回当前时区进行检索。
所有时间戳都不受时区限制。您可以单独保存时区,也可以将其保存为字符串。最好的办法是把 2018-12-16T17:36:29+11:00 通过从时钟中减去时区,然后保存 2018-12-16T06:36:29 以及 +11:00 分开。如果您不需要时区引用来进一步使用,那么您可以将时间标准化并放弃tz规范。
另外,根据你的需要,你可能会做这两件事。规范化时间戳将有助于以可靠的方式进行排序,而不受时间限制,同时,如果需要用于其他shopify查询,则可以存储和检索完整的字符串。

相关问题