当前,我有来自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
使用时区信息存储时间的正确方法是什么?
答案 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";