如何使用 JSON.parse reviver 参数解析日期字符串
我的 JSON 字符串包含一个返回这样值的日期字段:
"2009-04-04T22:55:16.0000000-04:00"
我对仅解析日期部分而不是时间特别感兴趣。我尝试使用 reviver 函数,但有趣的是,reviver 函数从未被调用! (在 Firefox 上尝试过)
这是我的代码来实现这一点:
var Site = {
.....
dateReviver: function(key, value) {
var a;
if (typeof value === 'string') {
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
},
loadArticle: function(id) {
....
proxy.getArticle(id, function(response) {
var data = JSON.parse(response.result, Site.dateReviver);
....
});
}
};
loadArticle
中的 JSON.parse 从不调用 dateReviver
。
我投入了一整天但没有运气!有人可以帮我吗?
My JSON string contains a date field that returns such a value:
"2009-04-04T22:55:16.0000000-04:00"
I am particularly interested in parsing only the date compartment not the time. I tried using a reviver function, but interestingly the reviver function is never invoked! (tried on Firefox)
Here is my code to accomplish that:
var Site = {
.....
dateReviver: function(key, value) {
var a;
if (typeof value === 'string') {
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
},
loadArticle: function(id) {
....
proxy.getArticle(id, function(response) {
var data = JSON.parse(response.result, Site.dateReviver);
....
});
}
};
JSON.parse in loadArticle
never calls dateReviver
.
I invested a whole day but no luck! Could someone please help me?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
使用 TypeScript,我的解决方案如下:
最好的;-)
它使用匿名 datereviver,由 JSON.parse 对每个属性调用。
恢复逻辑是检查该属性是否是字符串类型,如果是,则它是否看起来像日期的开始......
如果它是日期,则让 new Date(value) 进行实际解析...所有时区变化都以这种方式支持。
希望有帮助!
Using TypeScript, my solution is as follows:
Best of all worlds ;-)
It uses an anonymous datereviver, which gets called by JSON.parse on each property.
The reviver logic is to check whether the property is of type string and if so, whether it looks like the start of a date ...
If it is a date, then let new Date(value) do the actual parsing ... all timezone variations are supported that way.
Hope it helps!
正则表达式需要“Zulu”时区(末尾有“Z”字符),而示例日期时间字符串显示数字时区(“-04:00”)。以下正则表达式将接受两者:
<前><代码>/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\ d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/
如果时区数字不为零,您可能需要在解析和/或转换为 UTC 后实际修改日期,以尊重时区。
我可以看到 dateReviver() 被击中。在浏览器中尝试以下操作:
我在浏览器中看到以下内容,表明解析成功:
The regular expression expects a "Zulu" timezone (A 'Z' character at the end), while the sample date-time string shows a numeric timezone ('-04:00'). The following regex will accept both:
If the time zone digits are not zero, you might want to actually modify the date after parsing and/or converting to UTC, to respect the timezone.
I can see dateReviver() being hit. Try the following in a browser:
I am getting the following in the browser, indicating successful parsing:
扩展 jQuery.ajax 转换器设置对我来说效果很好,从默认设置
到
Extending the jQuery.ajax converters setting worked fine for me from its's default:
to
使用
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6 ]));
不会调整时区信息的日期,即示例中的
-4:00
。另一种方法是让 Date() 为您进行解析:
如果 JSON 已使用 JSON.stringify() 进行格式化,那么它将采用 UTC (Z) 格式。
The use of
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
does not adjust the date for the timezone information, the
-4:00
in the example.An alternative is to let Date() do the parsing for you:
If the JSON had been formatted with JSON.stringify() it would have been in UTC (Z).
嵌入式解决方案
Drop-in solution
我今天遇到了这个问题,我的方法与其他人提供的方法不同。
如果您提前知道包含日期的键,则可以像这样编写 reviver:
然后可以像这样使用它:
或者您可以拥有一个全局
keysToParse
对象,而不是每次都重新定义它I ran into this problem today and I have a different approach from those contributed by others.
If you know the keys that contain dates ahead of time, you could write the reviver like so:
You could then use it like so:
Or you could have a global
keysToParse
object instead of redefining it every time