Kam*_*eri 1071 javascript json
我已经看到了许多不同的JSON日期格式标准:
"\"\\/Date(1335205592410)\\/\"" .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\"" .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z" JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00" ISO 8601
Run Code Online (Sandbox Code Playgroud)
哪一个是正确的?还是最好的?这有什么标准吗?
fun*_*oll 1733
JSON本身没有指定日期应该如何表示,但JavaScript确实如此.
2012-04-23T18:25:43.511Z
原因如下:
话虽这么说,每个日期库都可以理解"自1970年以来的毫秒".所以为了便于携带,ThiefMaster是对的.
Thi*_*ter 121
JSON对日期一无所知..NET所做的是非标准的黑客/扩展.
我会使用一种格式,可以很容易地转换为DateJavaScript中的对象,即可以传递给它的对象new Date(...).最简单且可能最便携的格式是自1970年以来包含毫秒的时间戳.
Rus*_*Cam 40
没有正确的格式 ; 的JSON规范不以交换日期这就是为什么有这么多不同的方式来做到这一点指定的格式.
最好的格式可以说是ISO 8601格式的日期(见维基百科); 它是一种众所周知且广泛使用的格式,可以跨多种语言处理,非常适合互操作性.例如,如果您可以控制生成的json,则以json格式向其他系统提供数据,选择8601作为日期交换格式是一个不错的选择.
例如,如果您无法控制生成的json,那么您是来自几个不同现有系统的json的使用者,处理此问题的最佳方法是使用日期解析实用程序函数来处理预期的不同格式.
Bry*_*sen 24
I-JSON代表Internet JSON或Interoperable JSON,具体取决于您的要求.
协议通常包含旨在包含时间戳或持续时间的数据项.建议所有这些数据项都表示为ISO 8601格式的字符串值,如RFC 3339中所规定,附加限制是使用大写字母而不是小写字母,包含时区不是默认值,以及可选的尾随秒数即使它们的值为"00"也要包括在内.还建议所有包含持续时间的数据项符合RFC 3339附录A中的"持续时间"生成,并具有相同的附加限制.
Mad*_*eka 22
“2014-01-01T23:28:56.782Z”
\n日期以标准且可排序的格式表示,表示 UTC 时间(由 Z 表示)。ISO 8601 还通过将 Z 替换为时区偏移量的 + 或 \xe2\x80\x93 值来支持时区:
\n“2014-02-01T09:28:56.321-10:00”
\nISO 8601 规范中的时区编码还有其他变体,但 \xe2\x80\x9310:00 格式是当前 JSON 解析器支持的唯一 TZ 格式。一般来说,\xe2\x80\x99 最好使用基于 UTC 的格式 (Z),除非您有特定需要确定生成日期的时区(仅在服务器端生成中可能)。
\n注意:
\n var date = new Date();\n console.log(date); // Wed Jan 01 2014 13:28:56 GMT- \n 1000 (Hawaiian Standard Time) \n \n var json = JSON.stringify(date);\n console.log(json); // "2014-01-01T23:28:56.782Z"\nRun Code Online (Sandbox Code Playgroud)\n告诉你这是首选方式,即使 JavaScript 没有标准格式
\n// JSON encoded date\nvar json = "\\"2014-01-01T23:28:56.782Z\\"";\n\nvar dateStr = JSON.parse(json); \nconsole.log(dateStr); // 2014-01-01T23:28:56.782Z\nRun Code Online (Sandbox Code Playgroud)\n
小智 14
仅供参考我见过这种格式:
Date.UTC(2017,2,22)
Run Code Online (Sandbox Code Playgroud)
它适用于函数支持的JSONP$.getJSON().我不确定我是否会推荐这种方法......只是把它扔出去作为一种可能性,因为人们这样做.
FWIW:永远不要在通信协议中使用秒数,也不要使用自纪元以来的毫秒数,因为随着闰秒的随机实施,这些都充满了危险(你不知道发送方和接收方是否都能正确实现UTC闰秒).
一种宠物讨厌,但很多人认为UTC只是GMT的新名称 - 错!如果您的系统没有实现闰秒,那么您使用GMT(尽管不正确,通常称为UTC).如果您完全实现闰秒,那么您确实使用的是UTC.未来的闰秒无法知晓; 它们在必要时由IERS发布,需要不断更新.如果您正在运行一个试图实现闰秒但包含和过时的引用表(比您想象的更常见)的系统,那么您既没有GMT,也没有UTC,您有一个假装是UTC的不稳定系统.
这些日期计数器仅在以细分格式(y,m,d等)表示时才兼容.它们永远不会兼容时代格式.记在脑子里.
首选的方法是使用2018-04-23T18:25:43.511Z...
下图显示了为什么这是首选方式:

因此,正如您所看到的 Date 有一个本机 Method toJSON,它return采用这种格式,并且可以轻松地Date再次转换为......
JSON 本身没有日期格式,它不关心任何人如何存储日期。但是,由于这个问题是用 javascript 标记的,我假设您想知道如何在 JSON 中存储 javascript 日期。您可以只向该JSON.stringify方法传递一个日期,它会Date.prototype.toJSON默认使用,它依次使用Date.prototype.toISOString(Date.toJSON 上的 MDN):
const json = JSON.stringify(new Date());
const parsed = JSON.parse(json); //2015-10-26T07:46:36.611Z
const date = new Date(parsed); // Back to date object
Run Code Online (Sandbox Code Playgroud)
我还发现,每当我读取 JSON 字符串时,使用(JSON.parse 上的 MDN)的reviver参数将 ISO 字符串自动转换回 javascript 日期很有用。JSON.parse
const isoDatePattern = new RegExp(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/);
const obj = {
a: 'foo',
b: new Date(1500000000000) // Fri Jul 14 2017, etc...
}
const json = JSON.stringify(obj);
// Convert back, use reviver function:
const parsed = JSON.parse(json, (key, value) => {
if (typeof value === 'string' && value.match(isoDatePattern)){
return new Date(value); // isostring, so cast to js date
}
return value; // leave any other value as-is
});
console.log(parsed.b); // // Fri Jul 14 2017, etc...
Run Code Online (Sandbox Code Playgroud)
如有疑问,只需按F12键(在Firefox中为Ctrl + K),然后转到现代浏览器的javascript Web控制台,然后编写以下代码:
new Date().toISOString()
Run Code Online (Sandbox Code Playgroud)
将输出:
“ 2019-07-04T13:33:03.969Z”
-
| 归档时间: |
|
| 查看次数: |
974578 次 |
| 最近记录: |