当前位置: 首页 > 面试题库 >

如何使用JSON.parse Reviver参数解析日期字符串

充昌勋
2023-03-14
问题内容

我的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

我花了一整天,但没有运气!有人可以帮我吗?


问题答案:
  1. 正则表达式期望使用“ Zulu”时区(末尾为“ Z”字符),而示例日期-时间字符串则显示数字时区(“ -04:00”)。以下正则表达式将接受两种:
    /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/
    

如果时区数字不为零,则您可能要在解析和/或转换为UTC之后实际修改日期,以遵守时区。

  1. 我可以看到dateReviver()被击中了。在浏览器中尝试以下操作:
        <!-- saved from url=(0014)about:internet -->
    <html>
        <head>
            <script src="http://www.json.org/json2.js"></script>
            <script type="text/javascript" src="http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.js"></script>
            <script>
                $(function () {
                    // a mock proxy to return some json to play with
                    var proxy = {
                        getArticle: function(id, foo) { foo({
                            result: '["2009-04-04T22:55:16.0000000-04:00"]'
                        }); }
                    };
                    // the origial Site object, with the fixed regex
                    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|([+\-])(\d{2}):(\d{2}))$/.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);
                                // put the parsed JSON date on the page
                                $("#output").html(data[0].toString());
                            });
                        }
                    };
                    // try out our Site object
                    Site.loadArticle();
                });
            </script>
        </head>
        <body>
            <div id="output"></div>
        </body>
    </html>

我在浏览器中得到以下指示成功解析的信息:

    Sat Apr 4 15:55:16 PDT 2009


 类似资料:
  • 下面是SimpleDateFormat的设置。 下面是开发人员文档中可解析日期字符串的可能差异列表。正如您所看到的,它们中没有一个在时区中有冒号。 我的第二个问题是当我得到一个时区设置为Z的日期字符串时,这是将时区设置为GMT的标准,相当于0000。然而,我又得到了一个ParseException。下面是日期字符串的一个示例。 提前致谢

  • 问题内容: 我的日期格式为“ yyyy-MM-dd’T’HH:mm:ss.sssZ”。例如,日期为“ 2018-07-17T09:59:51.312Z”。我正在使用下面的代码来解析Java中的String。 这给了我“无法解析的日期:”例外。谁能告诉我该怎么做? 问题答案: 您忘了在 那会做的工作

  • 问题内容: 我想使用joda库(在scala中,但应该与java相同)解析DateTime。 来源看起来像 在Java中,这看起来像 不幸的是,这不起作用,但会引发异常: 为什么不起作用?当然,我可以忽略“ CEST”部分,而只分析其余部分,但是有时在输入中“ CEST”可以用“ CET”代替,所以我不想忽略它。 问题答案: 问题是因为区域名称短而并非唯一。请参阅DateTimeFormatter

  • 问题内容: 我有一个日期字符串,其格式为‘2009/05/13 19:19:30 -0400’。似乎Python的早期版本可能在strptime中支持尾随时区规范的%z格式标签,但2.6.x似乎已将其删除。 将这个字符串解析为datetime对象的正确方法是什么? 问题答案: 我有一个日期字符串,其格式为‘2009/05/13 19:19:30 -0400’。似乎Python的早期版本可能在str

  • 问题内容: 如何将下面的日期字符串解析为一个Date对象? 引发异常… 问题答案: 模式是错误的。您有3个字母的天的缩写,因此必须为。您有3个字母的月份缩写,因此必须为。由于这些日和月的缩写对语言环境敏感,因此您也希望将语言环境明确指定为英语,否则它将使用平台默认语言环境,而语言环境本身可能不是英语。 这在这里打印 根据我的时区是正确的。 如果您不想使用代替,我也会重新考虑。阅读javadoc以获

  • 问题内容: 有没有一种简单的方法可以在Python中解析HTTP日期字符串?根据该标准,有几种格式化HTTP日期字符串的方法。该方法应该能够处理此问题。 换句话说,我想将“ Wed,23 Sep 2009 22:15:29 GMT”之类的字符串转换为python时间结构。 问题答案: 如果需要对象,可以执行以下操作: