日期时间格式与时区

7

我从API接口中以字符串格式获取日期,格式为:yyyy-MM-dd'T'HH:mm:ss'Z'

问题在于,当我尝试保存它,比如说今天是 2015-01-23T13:42:00Z,MySQL数据库里不会显示标记ZT(日期会被保存成这样的格式:2015-01-23 13:42:00)。

我希望保持字段类型为日期类型,也就是说,我不想把日期保存到varchar字段中。

我不熟悉日期时区格式,所以欢迎任何建议。


2015-01-23T13:42:00Z 对我来说似乎是一个错误。它与ISO8601或RFC3339格式非常相似(分别为2015-01-23T13:42:00+00002015-01-23T13:42:00+00:00),除了Z标志之外。 - chromice
一般来说,在存储日期之前,您应该首先将其转换为UTC时区。然后,在检索它们时,将其转换为用户时区。 - chromice
5
@chromice 中的Z符号在ISO8601和RFC3339标准中都是被允许的。它明确表示UTC时间,而+00:00可能是UTC时间,也可能是某个时区与UTC时间刚好对齐(比如英国冬季)。这里没有错误,并且这种情况非常普遍。 - Matt Johnson-Pint
1个回答

13

首先阅读关于DATETIMETIMESTAMP类型的文档在mysql官方文档中

接着,决定使用哪种字段类型:

  • 如果您希望提交、存储和检索相同的值而不必让MySQL执行时区转换,则使用DATETIME字段。

  • 如果您希望使用特定时区提交和检索字段值,但实际上存储的是UTC时间,则使用TIMESTAMP

    • 请注意,对于基于UTC的值,您可能仍希望使用TIMESTAMP类型,但只需将会话时区明确设置为UTC即可。
  • 绝不要将日期/时间值存储在VARCHAR字段中。

最后,意识到数据库中实际存储的内容与查看数据时所看到的内容之间存在巨大差异。数据库以一种不可见的二进制表示形式高效地存储内容。您只是在显示期间观察到将其投影到特定格式的值。提交数据时使用的格式有助于构建二进制值,但这些字符串随后会被丢弃。稍后当您查看字段时,如果将其打印到屏幕上,则它会转换回字符串以便能够显示值。

这与您将整数发送为“1,234”没有区别-它实际上不存储该字符串,而是存储0x04D2(或二进制中的0000 0100 1101 0010)。 您可以将其读回为“1234”或“1,234”,并且正确放置逗号的格式化与值存储方式无关,只与显示该值的工具如何呈现输出有关。您的日期格式化情境也是如此。


讲解得很清楚。谢谢@Matt - Kristijan Iliev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接