【问题标题】:How to store time with timezone infomation in mysql datetime column? [duplicate]如何在mysql datetime列中存储带有时区信息的时间? [复制]
【发布时间】:2019-05-19 11:19:29
【问题描述】:

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

第一个问题:

2018-12-16T17:36:29+11:00究竟是什么意思?

日期:2018-12-16,

时间:17:36:29,

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

第二个问题:

如果我想将时间戳存储到 mysql 日期时间列中。 我收到此错误

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

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

【问题讨论】:

    标签: php mysql laravel time


    【解决方案1】:

    我不熟悉 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 查询,您可以存储和检索完整的字符串。

    【讨论】:

    • 请不要推荐TIMESTAMP栏目。使用DATETIME。否则,您的大部分答案都是正确的。
    【解决方案2】:

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

    【讨论】:

    • 这将存储相对于运行查询时的时间戳,它不会保存 OP 所需的时间戳。由于它们可以异步运行,因此可能会漂移很多。
    • 感谢您的评论。我误解了这个问题。我已经更新了我的答案,现在应该会得到正确的结果。
    【解决方案3】:

    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 字段类型)和偏移量小时在另一列。

    示例:

    |    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));
    

    【讨论】:

    • 请注意,timezone 列(实际上更准确地说是 time_offset)不应该是整数,因为在某些时区,偏移量可以是半小时甚至一刻钟。
    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    相关资源
    最近更新 更多