2009-11-24 53 views
4

我的JSON字符串包含返回这样的值日期字段:如何使用JSON.parse齐磊参数解析日期字符串

"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); 
     .... 
    }); 
} 
}; 

JSON.parse在loadArticle永远不会调用dateReviver

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

回答

4
  1. 正则表达式需要一个“祖鲁”时区(A“Z”的字符在结束时),而样品的日期 - 时间字符串表示一个数字时区(“-04:00”)。下面的正则表达式都接受:

    /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/ 
    

    如果时区数字不为零,你可能想分析和/或转换为UTC,尊重时区后实际修改日期。

  2. 我可以看到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 
    
+0

谢谢奥伦;) 最终我发现问题与你的帮助。我正在使用jayrock自带的json.js文件,它在解析函数中不接受reviver参数。 我所做的是使用eval方法来解析(这是听起来很奇怪的地方)JSON字符串:s 我非常感谢;) – Aleyna 2009-11-26 02:20:27

3

扩展jQuery.ajax转换器设置工作得很好,我从它的默认:

"text json": jQuery.parseJSON 

"text json": function (xmlValue) { 
      var value = JSON.parse(xmlValue, Site.dateReviver); 
     return value; 
     } 
2

采用return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));

不调整为时区信息的日期,在该实例中-4:00

另一种方法是让日期()做解析为您提供:

var dateReviver = function (key, value) { 
    var a; 
    if (typeof value === 'string') { 
     a = Date.parse(value); 
     if (a) { 
      return new Date(a); 
     }  
    } 
    return value; 
} 

如果JSON已经格式化JSON.stringify()它会一直在UTC(Z)。

+0

这会尝试解析一切,不仅仅是日期。 'Date.parse(“0”)&& alert('fail')' – 2016-11-07 12:26:30

4

使用TypeSript,我的解决方案如下:

export function parseWithDate(jsonString: string): any { 
    var reDateDetect = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/; // startswith: 2015-04-29T22:06:55 
    var resultObject = JSON.parse(jsonString,(key: any, value: any) => { 
     if (typeof value == 'string' && (reDateDetect.exec(value))) { 
      return new Date(value); 
     } 
     return value; 
    }); 
    return resultObject; 
} 

所有世界;-) 它使用了一个匿名datereviver,它获取由JSON.parse对每个属性称为最佳。 reviver逻辑是检查属性是否为字符串类型,如果是,是否看起来像日期的开始... 如果它是一个日期,然后让新的日期(值)做实际的解析.. 。所有时区变化都支持这种方式。

希望它有帮助!

0
function dateReviver (k,v) { 

    var isnum = /^\d+$/.test(v); 

    // Check if number since Date.parse(number) returns valid date 
    if (isnum) { 
     return v; 
    } 

    if (Date.parse(v)) { 
     return new Date(Date.parse(v)); 
    } 
    return v; 
}