我刚接触JSON,在阅读JSON规范时,发现没有日期和时间的数据类型。经过一些研究,我发现有几种建议,其中之一是使用UNIX时间戳。这是最简单的方法吗?日后会遇到什么问题吗?
2014-03-12T13:37:27+00:00
可以跨越多种编程语言。
编辑:
JSON 只识别这些 类型 :
string
number
object
array
true
false
null
我认为最好的答案取决于将来使用日期/时间的上下文。
正确的格式取决于...
我建议使用json数字(Unix时间戳),然后根据用例结合用户时区或单独存储的“渲染时区”(json字符串)进行组合。这允许呈现最相关的日期/时间,并允许根据用户的位置/语言环境轻松使用不同的日期/时间格式。
或者,如果JSON可读性对您很重要,则可以使用ISO字符串格式,但仍要在代码中进行解析和时区转换,以获得渲染用户友好的日期/时间具有最大灵活性。
警告 如果您手动编写这些时间戳,请勿弄错。不同地区/日期的不同时区偏移量在一年中的不同日期更改,如果您针对给定区域/日期放置了错误的偏移量,则时间戳将无法表示正确的时间点...并且在解析和格式化它时,您可能会遇到显示错误时间的问题。
即,如果您希望人类能够直接阅读JSON并具有意义的日期/时间。
在这种情况下,@Ribtoks的答案可能是最好的。尽管如果日期/时间存储在与用户不同的时区中,则用户可能会感到困惑和/或需要自行执行时区转换以正确解释日期/时间。
更高的手动编辑诱惑和格式错误将导致解析错误。还可能出现UTC偏移量不正确(给定区域/日期的错误偏移量/时间)的情况,这将导致在格式化后向用户显示错误的日期/时间。
即,您希望以用户本地时区的方式向用户显示特定的时间点(日期/时间)。
在这种情况下,除了日期/时间数据表示特定时刻之外,您还需要一种方法来确定对于给定用户什么是“正确”的时区(不同的主题)。
您的代码将需要解析/转换JSON日期/时间数据,以便可以将其与用户的时区数据(例如America/Denver
或Europe/Berlin
)组合以便以用户友好的方式进行打印格式。使用moment-timezone
库进行此操作。
例如,时刻:
December 31, 2020 8:00 PM America/Denver
与
January 1, 2021 4:00 AM Europe/Berlin
是相同的
11/25/20 7:00PM Europe/Berlin
25.11.20 19:00 Europe/Berlin
25/11/20 19:00 Europe/Berlin
所以在这种情况下,我还将日期/时间存储为json数字(Unix时间戳),然后将事件时区作为该时间戳旁边的字符串存储。这仍然使得解析/时区转换计算更简单。然后,您仍然需要确定用户特定的日期/时间格式首选项(浏览器区域设置、用户配置文件等...本问题范围之外)。你可以继续保留位数,直到64位,包括小时和分钟等。在这种情况下,DD / MM / YYYY是21位。 通过使用这种方法,你同意@Clay Ferguson的观点,并且可以非常轻松地并且可能非常快速地按年、月、日过滤Map中的KeySet。
如果您更关心内存(和磁盘空间)的效率而不是原始JSON的人类可读性,最好将其存储为整数(即日期的毫秒值)。此外,如果您真的想要优化空间节省,可以将该整数编码为Base64,然后让JSON将Base64字符串作为JSON字符串保存。我甚至没有提到十六进制,因为如果您要编码为非十进制的内容,您可能会转向Base64。换句话说,与Base64相比,十六进制编码没有任何好处,因此只需使用Base64。
+00:00
的时区表示并不是一个用户友好的时区,因为它是相对于 GMT 的固定偏移量,而许多用户都有夏令时,这意味着仅使用相对于 GMT 的固定偏移量只在一年中的一半有效。这就是为什么用户需要按地区指定时区(例如 America/Denver
或 Europe/Amsterdam
),然后渲染用户界面日期的软件需要使用 tzdata 表格以便找出该特定日期/地区的正确偏移量。如果您使用带有 +00:00
的字符串,则需要根据用户的 TZ 进行解析和重新渲染。 - mattpr