在JSON中存储日期/时间的最佳方法是什么?

时间:2014-03-12 14:39:08

标签: json date types

我是JSON的新手,在审核JSON规范时,我注意到日期和时间没有数据类型。我做了一些研究,并提出了一些建议,其中一个建议是使用UNIX时间戳。这是最简单的方法吗?我会遇到任何问题吗?

4 个答案:

答案 0 :(得分:28)

我建议使用ISO 8601 dates。特别是这种格式

2014-03-12T13:37:27+00:00

可以在许多编程语言中移植。

修改

JSON只知道这些types

string
number
object
array
true
false
null

日期和日期时间最好以广泛使用的格式存储为字符串。

答案 1 :(得分:2)

当然你应该在JSON中保存String。但是我们假设你要过滤日期。您仍然可以将“数字”存储为字符串,如“125”(二进制编码的十进制),当您将其转换回125时,它将非常有用。 那说, 如果要自定义日期编号以进行过滤,例如: 使用long类型并对其执行按位操作。 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

  • 为YYYY保留12位,直到4096-1年。
  • 为MM保留4位,因为(0-11)就足够了。
  • 为DD保留5位,因为该月的某天是(1-31)。

您可以继续保留数小时,分钟直到64位。 在这种情况下,DD / MM / YYYY是21位。 通过使用此方法,您同意@Clay Ferguson并且您能够以“<”方式过滤地图中的KeySet和“>”按年,月,日非常容易,可能非常快。

答案 2 :(得分:1)

我认为最好的答案取决于使用该日期/时间的环境。

TL / DR;

正确的格式取决于...

  • 如何使用数据的上下文(请参见下面的示例)
  • 人员或代码是否在使用json,以及您的编程语言或库是否轻松支持特定格式。

我建议使用json数字(unix时间戳),然后根据用例将其与用户时区或单个单独存储的“渲染时区”(json字符串)组合。这样可以将最相关的日期/时间呈现呈现给用户,并允许您根据用户的位置/地区轻松使用不同的日期/时间格式。

或者,如果对人类来说json的可读性对您很重要,则可以使用ISO字符串格式,但仍然可以在代码中进行解析和时区转换,以最大程度地灵活呈现用户友好的日期/时间。

警告:如果您是手工编写这些时间戳,请不要弄乱它们。全年中不同区域的不同时区的偏移量会在不同的日期发生变化,如果您为给定的区域/日期输入了错误的偏移量,则您的时间戳将无法代表正确的时间...并且在解析和格式化时可能会出现显示时间错误的问题。

如果您希望JSON日期易于阅读

即,如果您希望人类直接阅读json并知道日期/时间的含义。

在这种情况下,@ Ribtoks答案可能是最好的。尽管如果日期/时间存储在与用户不同的时区中,则用户可能会感到困惑和/或需要在他们的头脑中进行时区转换,以便正确地解释日期/时间。

对人工进行人工编辑和格式错误的较高诱惑,这将导致解析错误。同样,不正确的UTC偏移量(给定地区/日期的偏移量/时间错误)也会导致格式化后向用户显示错误的日期/时间。

如果json只是数据存储,并且日期/时间将通过代码呈现

用户本地日期/时间格式

即您想要向用户显示其本地时区中的特定时间点(日期/时间)。

在这种情况下,除了代表特定时刻的日期/时间数据外,您还需要一种方法来识别给定用户(不同主题)的“正确”时区。

您的代码将需要解析/转换JSON日期/时间数据,以便可以将其与用户的时区数据(例如America/DenverEurope/Berlin)结合使用,以方便用户打印格式道路。看一下moment-timezone库。

例如时刻:
December 31, 2020 8:00 PM America/Denver

相同 January 1, 2021 4:00 AM Europe/Berlin

这类行为通常对于社交媒体,博客文章或留言板之类的东西来说是理想的,因为用户希望知道什么东西是在自己的本地时间发布的,而不在乎作者的时区。

在这种情况下,由于我必须解析/格式化日期/时间,因此通常将日期/时间存储在unix时间戳(整数... json号)中。

采用数字进行数学运算比解析包括内置时区的字符串时间戳以了解底层的特定时间点,然后为用户格式化新的日期/时间字符串要简单得多。不同的时区。

事件/位置-本地日期/时间格式

即您想向特定时区的用户显示特定时间(日期/时间)。

示例:柏林(个人)音乐演唱会的日期/时间。如果您有在伦敦购买演唱会的门票的人,那么向他们展示音乐会在伦敦的几点开始会造成混淆,因为他们将参加在柏林举行的活动。

这与上面的“ User-Local”案例相同,不同之处在于,您可以为单个用户显示日期/时间,而不是格式化/呈现每个用户在不同时区的特定时间。事件位置时区”。

因此,除了存储特定的日期/时间之外,您还应该存储要呈现该日期/时间的时区。

虽然您可以将日期/时间预先格式化为字符串,但这为您提供了更少的选项来以编程方式(即使用代码)更改日期格式。例如,您可能要使用本地事件时区,但对不同国家/地区的用户使用不同的日期/时间格式。

例如将于2020年11月25日晚上7点在柏林举行音乐会。时间相同,时区相同,但格式不同。

美国
11/25/20 7:00PM Europe/Berlin
德国
25.11.20 19:00 Europe/Berlin
英国
25/11/20 19:00 Europe/Berlin

因此,在这种情况下,我还将日期/时间存储为json数字(unix时间戳),然后还将事件时区作为字符串存储在该时间戳旁边。这样做使解析/时区转换的计算更加简单。然后,您仍然需要找出用户的特定日期/时间格式首选项(浏览器语言环境,用户个人资料等...超出此问题的范围)。

关于弄错时区/偏移的轶事

我有一个同事在他的计算机上设置了错误的时区(导致他所在位置的UTC偏移量错误)。

要解决此问题,他禁用了网络时间,并手动调整了计算机时钟以更正错误的时区。

当他发出特定时间的会议邀请时,邀请中包括一个时间和该时间的时区...这很重要,当您跨越时区边界打电话时,每个人都可以在本地看到会议时间并同时拨入。就我的同事而言,这些会议当然是在不同时区发出的。

他非常脾气暴躁,每个人都错过了一个小时的会议,并向我们展示了他是如何安排在下午3点安排的,但是我们都收到了下午4点的邀请。

故事的故事...骇客通常最终会适得其反,因此确保您及时存储了正确/预期的时刻非常重要。您始终可以更改稍后显示特定时间点的时区/格式,但前提是您已存储了正确的开始时间。

在处理表单输入时(例如,日期选择器提供YYYY-MM-DD,时间选择器提供HH:MM),获取正确的基本时刻最重要。您需要确保根据用例,使用时区上下文解释来自用户的这些日期/时间输入字符串。

答案 3 :(得分:-1)

如果你更关心内存(和磁盘空间)的效率而不是原始JSON的人类可读性,那么它最好存储为整数(即​​日期的毫秒值)。此外,如果您真的想优化节省空间,可以将该整数编码为Base64,然后让JSON将base64字符串保存为JSON字符串。我甚至没有提到十六进制,因为如果你编码为非十进制的东西,你也可以去base64。换句话说,对base64进行十六进制编码没有任何好处所以只需使用base64。