【问题标题】:Converting "long form" datetime string into javascript date object将“长格式”日期时间字符串转换为 javascript 日期对象
【发布时间】:2013-04-02 00:52:11
【问题描述】:

我有一个返回 JSON 对象的当前时间网络服务

{
  "tz": "America\/Chicago", 
  "hour": 15, 
  "datetime": "Mon, 01 Apr 2013 15:46:58 -0500", 
  "second": 58, 
  "error": false, 
  "minute": 46
}

有没有简单的方法来转换长格式的日期时间字符串

"datetime": "Mon, 01 Apr 2013 15:46:58 -0500" 

到一个 javascript 日期对象? (除了使用正则表达式解析字符串)

【问题讨论】:

  • 也许这有帮助:stackoverflow.com/q/1647550/218196.
  • 格式在RFC 3339中定义。它在老化的互联网协议中非常流行。该格式唯一的好处是,您不需要使用正则表达式。列数是固定的(“01”)。

标签: javascript json date rfc3339


【解决方案1】:
var dt= "Mon, 01 Apr 2013 15:46:58 -050";
var date = new Date(dt);
alert(date.getDay());

【讨论】:

  • 当符合标准的方法可用于稍微多一点的工作时,依赖实现相关细节的巧合可能不是一个好主意。
  • 依赖于实现。 The spec says Date ctor 可能会收到符合 RFC2822 的 dateString。
【解决方案2】:
var dat = {
  "tz": "America\/Chicago", 
  "hour": 15, 
  "datetime": "Mon, 01 Apr 2013 15:46:58 -0500", 
  "second": 58, 
  "error": false, 
  "minute": 46
};

var dateObj = new Date(dat.datetime);

Mozilla Developer Network 可能会向您展示一些更有用的信息。 Date 构造函数将为您解析字符串。

【讨论】:

  • -1:对不起,除了 w3schools 链接之外,您的回答很好。你应该使用MDN链接(或es5.github.com)。见w3fools.com
  • 这真的很丰富,谢谢。这是我在 google 搜索中看到的第一个链接,关于 Date 对象的信息看起来不错,但我对 W3schools 并不了解。
【解决方案3】:

解析日期字符串的唯一安全方法是自己进行。 ES5 为 Date.parse 定义了一个基于 ISO8601 的标准字符串,但并非所有正在使用的浏览器都支持它,而且您的字符串无论如何都与该格式不一致。

其他字符串值对有限的浏览器“有效”,但这对于 Web 应用程序来说不是可靠的策略。

解析日期字符串非常简单:拆分位,从各个部分创建日期对象,并在需要时应用偏移量。因此,如果您的字符串是 Mon, 01 Apr 2013 15:46:58 -0500,您可以使用如下函数:

function parseDateString(s) {
  var months = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5,
                jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};
  s = s.split(/[\s:]/);

  var d = new Date(s[3], months[s[2].toLowerCase()], s[1], s[4], s[5], s[6]);
  var sign = s[7]<0? 1 : -1;
  var l = s[7].length;

  // offsetMinutes is minutes to add to time to get UTC
  var offsetMinutes = sign * s[7].substring(l-2,l) + sign * s[7].substring(l-4,l-2) * 60;

  // Add offset and subtract offset of current timezone
  d.setMinutes(d.getMinutes() + offsetMinutes - d.getTimezoneOffset());

  return d;
}

var s = 'Mon, 01 Apr 2013 15:46:58 -0500'
alert(s + '\n' + parseDateString(s));  // Mon, 01 Apr 2013 15:46:58 -0500
                                       // Tue Apr 02 2013 06:46:58 GMT+1000

【讨论】:

    【解决方案4】:

    这可能会被否决,但您可能需要考虑使用momentjs 进行日期/时间操作。使用起来不错的库。

    var myDate = moment(myObj.datetime);
    

    现在 myDate 是一个 JavaScript 日期对象。

    【讨论】:

      【解决方案5】:

      /* 您可以在需要时将日期字符串重写为更常见的格式 - 获取月份和时区是大部分工作: */

      function rewriteDate(str){
          var months= ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 
          'jul', 'aug', 'sep', 'oct', 'nov', 'dec'],
          dA= str.toLowerCase().split(' '),
          m= months.indexOf(dA[2].substring(0, 3));
      
          ++m;
          if(m<10) m= '0'+m;
          dA[2]= m;
      
          var dmy= dA.slice(1, 4).reverse().join('-');
      
          var t= 'T'+dA[4], L= dA[5].length-2,
          z= dA[5].substring(0, L)+':'+dA[5].substring(L);
          return dmy+t+z;
      }
      
      var jsn={
          "datetime":"Mon, 01 Apr 2013 15:46:58 -0500"
      };
      jsn["datetime"]= rewriteDate(jsn.datetime);
      //returns:  (string) "2013-04-01T15:46:58-05:00"
      
      
      alert(new Date(jsn.datetime).toUTCString());
      
      //  returns: (Date) Mon, 01 Apr 2013 20:46:58 GMT
      

      【讨论】:

        猜你喜欢
        • 2014-08-10
        • 1970-01-01
        • 2019-01-31
        • 1970-01-01
        • 2018-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多