我从API接口中以字符串格式获取日期,格式为:yyyy-MM-dd'T'HH:mm:ss'Z'
问题在于,当我尝试保存它,比如说今天是 2015-01-23T13:42:00Z
,MySQL数据库里不会显示标记Z
和T
(日期会被保存成这样的格式:2015-01-23 13:42:00
)。
我希望保持字段类型为日期类型,也就是说,我不想把日期保存到varchar
字段中。
我不熟悉日期时区格式,所以欢迎任何建议。
首先阅读关于DATETIME
和TIMESTAMP
类型的文档在mysql官方文档中。
接着,决定使用哪种字段类型:
如果您希望提交、存储和检索相同的值而不必让MySQL执行时区转换,则使用DATETIME
字段。
如果您希望使用特定时区提交和检索字段值,但实际上存储的是UTC时间,则使用TIMESTAMP
。
TIMESTAMP
类型,但只需将会话时区明确设置为UTC即可。绝不要将日期/时间值存储在VARCHAR
字段中。
最后,意识到数据库中实际存储的内容与查看数据时所看到的内容之间存在巨大差异。数据库以一种不可见的二进制表示形式高效地存储内容。您只是在显示期间观察到将其投影到特定格式的值。提交数据时使用的格式有助于构建二进制值,但这些字符串随后会被丢弃。稍后当您查看字段时,如果将其打印到屏幕上,则它会转换回字符串以便能够显示值。
这与您将整数发送为“1,234”没有区别-它实际上不存储该字符串,而是存储0x04D2
(或二进制中的0000 0100 1101 0010
)。 您可以将其读回为“1234”或“1,234”,并且正确放置逗号的格式化与值存储方式无关,只与显示该值的工具如何呈现输出有关。您的日期格式化情境也是如此。
2015-01-23T13:42:00Z
对我来说似乎是一个错误。它与ISO8601或RFC3339格式非常相似(分别为2015-01-23T13:42:00+0000
或2015-01-23T13:42:00+00:00
),除了Z
标志之外。 - chromiceZ
符号在ISO8601和RFC3339标准中都是被允许的。它明确表示UTC时间,而+00:00可能是UTC时间,也可能是某个时区与UTC时间刚好对齐(比如英国冬季)。这里没有错误,并且这种情况非常普遍。 - Matt Johnson-Pint