如何在mysql datetime列中存储带有时区信息的时间?

时间:2018-12-19 00:59:03

标签: php mysql laravel time

当前,我有来自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列中。 我收到此错误

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

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

3 个答案:

答案 0 :(得分:2)

  

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

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

select
      a.uid, a.name, a.likes, b.fruit
from (
     select *, row_number() over(partition by uid order by keyid DESC) rn
     from TableA
     ) a
inner join (
     select *, row_number() over(partition by uid order by keyid DESC) rn
     from TableB
     ) b on a.uid = b.uid and b.rn = 1
where a.rn = 1

我对Shopify及其API不熟悉,但是,如果了解/存储时区很重要,我会将UTC时间存储在数据库的一列中(使用UTC Date: `2018-12-16` UTC Time: `17:36:29` Offset: `+11:00` 字段类型),并且另一列中的抵消时间。

示例:

datetime

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

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

答案 1 :(得分:0)

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

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

关于第二个问题,you don't

  

MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC返回当前时区进行检索。

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

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

答案 2 :(得分:0)

时区:+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";