【问题标题】:Parsing ISO 8601 date in Javascript在 Javascript 中解析 ISO 8601 日期
【发布时间】:2011-06-17 07:20:10
【问题描述】:

需要有关将具有以下结构的 ISO 8601 日期转换为 javascript 的帮助/提示。

CCYY-MM-DDThh:mm:ssTZD

我想这样格式化日期:

January 28, 2011 - 7:30PM EST

我想让这个解决方案尽可能简洁。

【问题讨论】:

标签: javascript datetime formatting iso8601


【解决方案1】:

Date 对象处理 8601 作为它的第一个参数:

var d = new Date("2014-04-07T13:58:10.104Z");
console.log(d.toString());

【讨论】:

  • 并非在所有浏览器中。请记住,ECMA 规范对 Date() 的参数格式过去或现在仍然含糊不清。这就是为什么即使 IE11 也无法处理您的建议。
  • @RenéStalder 我实际上只是在 IE11 中测试了它,它可以工作。你在其他 IE 版本中测试过吗?
  • @RenéStalder 刚刚在 Win7 上的 IE9 中进行了测试,它也可以在那里工作。事实上到目前为止,我还没有找到一个不支持它的浏览器。
  • 在 IE 9 中不起作用:肯定是 Quirks 模式。我们中的一些人需要浏览器兼容性。
  • 日期解析依赖于实现直到 ES5。旧浏览器会显示不一致的结果。
【解决方案2】:

datejs 可以解析以下内容,你不妨试试。

Date.parse('1997-07-16T19:20:15')           // ISO 8601 Formats
Date.parse('1997-07-16T19:20:30+01:00')     // ISO 8601 with Timezone offset

编辑:正则表达式版本

x = "2011-01-28T19:30:00EST"

MM = ["January", "February","March","April","May","June","July","August","September","October","November", "December"]

xx = x.replace(
    /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):\d{2}(\w{3})/,
    function($0,$1,$2,$3,$4,$5,$6){
        return MM[$2-1]+" "+$3+", "+$1+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6
    }
)

结果

January 28, 2011 - 7:30PM EST

Edit2:我将时区更改为 EST,现在我关注了

x = "2011-01-28T19:30:00-05:00"

MM = {Jan:"January", Feb:"February", Mar:"March", Apr:"April", May:"May", Jun:"June", Jul:"July", Aug:"August", Sep:"September", Oct:"October", Nov:"November", Dec:"December"}

xx = String(new Date(x)).replace(
    /\w{3} (\w{3}) (\d{2}) (\d{4}) (\d{2}):(\d{2}):[^(]+\(([A-Z]{3})\)/,
    function($0,$1,$2,$3,$4,$5,$6){
        return MM[$1]+" "+$2+", "+$3+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6 
    }
)

返回

January 28, 2011 - 7:30PM EST

基本上

String(new Date(x))

返回

Fri Jan 28 2011 19:30:00 GMT-0500 (EST)

正则表达式部分只是将上面的字符串转换为您需要的格式。

January 28, 2011 - 7:30PM EST

【讨论】:

  • 我正在制作一个小部件,如果我可以有一个简单的函数,我可以将它放入我的 JS 文件中。我认为 datajs 可能为此矫枉过正?感谢您的建议和快速回复!
  • @Slythic,我会写正则表达式,请稍等。
  • @Slythic,已更新,如有错误请告诉我。
  • 嗯...没有按预期工作。我应该在之前添加这个!以下是返回日期的示例:“2011-01-28T19:30:00-05:00”
  • 啊,好吧,时区不是字符串,让我弄清楚,如何解析它。
【解决方案3】:

如果你想保持简单,这就足够了:

function parseIsoDatetime(dtstr) {
    var dt = dtstr.split(/[: T-]/).map(parseFloat);
    return new Date(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, 0);
}

note parseFloat 是必须的,parseInt 并不总是有效。地图需要 IE9 或更高版本。

适用于格式:

  • 2014-12-28 15:30:30
  • 2014-12-28T15:30:30
  • 2014-12-28

对时区无效,请参阅其他答案。

【讨论】:

  • +1 简单便携。我进行了此更改以将日期解释为 UTC:return new Date(Date.UTC(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, 0));
  • 处理最重要部分的非常好的小功能:修复该当月索引。
  • 唉,IE11 Enterprise(基本上是IE8)不支持地图。呻吟
  • 找到了一个 polyfill,它也适用于 IE8(只需将 .map 更改为 .myMap):Array.prototype.myMap = function(callbackFn) { var arr = []; for (var i = 0; i < this.length; i++) { arr.push(callbackFn(this[i], i, this)); } return arr; }
【解决方案4】:

也许,您可以使用 moment.js,在我看来,它是用于解析、格式化和处理客户端日期的最佳 JavaScript 库。你可以使用类似的东西:

var momentDate = moment('1890-09-30T23:59:59+01:16:20', 'YYYY-MM-DDTHH:mm:ss+-HH:mm:ss');
var jsDate = momentDate.toDate();

// Now, you can run any JavaScript Date method

jsDate.toLocaleString();

使用像 moment.js 这样的库的优势在于,即使在 IE 8+ 等旧版浏览器中,您的代码也能完美运行。

这里是关于解析方法的文档:https://momentjs.com/docs/#/parsing/

【讨论】:

【解决方案5】:

根据MSDN,JavaScript Date 对象不提供任何特定的日期格式化方法(您可能会在其他编程语言中看到)。但是,您可以使用一些 Date 方法和格式来实现您的目标:

function dateToString (date) {
  // Use an array to format the month numbers
  var months = [
    "January",
    "February",
    "March",
    ...
  ];

  // Use an object to format the timezone identifiers
  var timeZones = {
    "360": "EST",
    ...
  };

  var month = months[date.getMonth()];
  var day = date.getDate();
  var year = date.getFullYear();

  var hours = date.getHours();
  var minutes = date.getMinutes();
  var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM");
  var timezone = timeZones[date.getTimezoneOffset()];

  // Returns formatted date as string (e.g. January 28, 2011 - 7:30PM EST)
  return month + " " + day + ", " + year + " - " + time + " " + timezone;
}

var date = new Date("2011-01-28T19:30:00-05:00");

alert(dateToString(date));

您甚至可以更进一步,覆盖Date.toString() 方法:

function dateToString () { // No date argument this time
  // Use an array to format the month numbers
  var months = [
    "January",
    "February",
    "March",
    ...
  ];

  // Use an object to format the timezone identifiers
  var timeZones = {
    "360": "EST",
    ...
  };

  var month = months[*this*.getMonth()];
  var day = *this*.getDate();
  var year = *this*.getFullYear();

  var hours = *this*.getHours();
  var minutes = *this*.getMinutes();
  var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM");
  var timezone = timeZones[*this*.getTimezoneOffset()];

  // Returns formatted date as string (e.g. January 28, 2011 - 7:30PM EST)
  return month + " " + day + ", " + year + " - " + time + " " + timezone;
}

var date = new Date("2011-01-28T19:30:00-05:00");
Date.prototype.toString = dateToString;

alert(date.toString());

【讨论】:

    【解决方案6】:

    看起来moment.js 是最受欢迎的并且正在积极开发中:

    moment("2010-01-01T05:06:07", moment.ISO_8601);
    

    【讨论】:

    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多