【问题标题】:How can I format an ISO 8601 date to a more readable format, using Javascript? [duplicate]如何使用 Javascript 将 ISO 8601 日期格式化为更易读的格式? [复制]
【发布时间】:2016-06-23 22:31:04
【问题描述】:

我正在使用 API 从帖子中调用日期。

日期在ISO 8601 format 中返回:

2015-11-09T10:46:15.097Z

我希望我的日期格式如下:

09/11/2015

然后,稍后,我想将它们插入到我的 HTML 中,如下所示:

$(data).each(function(){
    var html = '<randomhtml> '+this.created_at+' <randomhtml>
    $('#stream').append(html);
});

有人知道如何将日期更改为正确的格式吗?

【问题讨论】:

标签: javascript html date date-format time-format


【解决方案1】:

所有浏览器

使用您正在使用的源格式格式化日期的最可靠方法是应用以下步骤:

  1. 使用您的时间字符串作为new Date() 的输入
  2. 使用.getDate().getMonth().getFullYear()分别获取日、月、年
  3. 根据您的目标格式将各个部分粘贴在一起

下面的format 函数向您展示了结合这四个步骤的最佳方式:

var date = '2015-11-09T10:46:15.097Z';

function format(input) {
    var date = new Date(input);
    return [
       ("0" + date.getDate()).slice(-2),
       ("0" + (date.getMonth()+1)).slice(-2),
       date.getFullYear()
    ].join('/');
}

document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(另见this Fiddle)。

注意

虽然这种方法适用于所有浏览器,但如果您需要支持 IE8-- 之前的浏览器,则需要在 new Date(input) 之前执行额外的步骤来解析您的 ISO 8601 格式。请参阅Javascript JSON Date parse in IE7/IE8 returns NaN 上已接受的答案,以获得完全符合此要求的函数。


仅限现代浏览器

您也可以使用内置的.toLocaleDateString 方法为您进行格式化。你只需要传递正确的语言环境和选项来匹配正确的格式,不幸的是只有现代浏览器支持 (*) :

var date = '2015-11-09T10:46:15.097Z';

function format(input) {
    return new Date(input).toLocaleDateString('en-GB', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
    });
}

document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(另见this Fiddle)。


(*) According to the MDN,“现代浏览器”是指 Chrome 24+、Firefox 29+、IE11、Edge12+、Opera 15+ 和 Safari nightly build

【讨论】:

  • 一般建议使用 Date 构造函数来解析字符串(或 Date.parse,它们是等价的),因为它不可靠。即使是符合 ISO 8601 的字符串也不能被所有正在使用的浏览器正确解析。
  • @RobG : Even ISO 8601 compliant strings are not correctly parsed by all browsers in use. - 你知道任何可以确认 ISO 8601 日期字符串解析不正确的来源吗?或者关于哪些浏览器受到影响的任何细节?另外,您会推荐哪种替代方法?手动将 ISO 8601 解析为其组件?
  • IE 8(8% usage,按版本排名第三,是所有 Safari 版本总和的两倍)根本不会解析 ISO 8601 字符串。像 2016-02-25 这样的日期被某些人解析为 UTC,而其他人则被解析为本地。建议手动解析,如果只需要解析一种格式,库可以提供帮助,但不是必需的。
  • @RobG:感谢您的反馈。我添加了一个注释来解决这个问题。
【解决方案2】:

重新格式化日期字符串的最简单和最可靠的方法就是重新格式化字符串。所以使用 split (或 match) 来获取值并按照你想要的顺序返回它们,忽略你不需要的位,例如:

function isoToDMY(s) {
   var b = s.split(/\D/);
   return b[2] + '/' + b[1] + '/' + b[0];
}

document.write(isoToDMY('2015-11-09T10:46:15.097Z'));

如果您希望输出日期也考虑主机系统时区(例如,UTC+0530 时区中的 2015-11-09T20:46:15Z 将是 2015-11-10T02:16:15Z)),那么您应该手动将其解析为 Date 对象,然后获取年、月和日值。

库可以帮助解析,但解析和验证值的函数只有几行代码。

【讨论】:

    【解决方案3】:

    最简单的方法是使用字符串

    $(data).each(function(){
    
        var date = this.created_at.split('T') // split on the "T"   -> ["2015-11-09", "10:..."]
                                  .shift()    // get the first part -> "2015-11-09"
                                  .split('-') // split again on "-" -> ["2015", "11", "09"]
                                  .reverse()  // reverse the array  -> ["09", "11", "2015"]
                                  .join('/')  // join with "/"      -> "09/11/2015"
    
        var html = '<randomhtml> ' + date + ' <randomhtml>';
        $('#stream').append(html);
    });
    

    由于它是 UTC 日期,因此只需传递 new Date() 会增加时区的差异,并且并不总是输出正确的日期。
    如果您需要验证日期,可以使用正则表达式检查有效的 UTC 日期。

    【讨论】:

    • 如果您要链接方法,不妨在一个方法中完成 - this.created_at.split("T")[0].split("-").reverse().join("/"); - 尽管添加注释来解释它具有哪些输入和输出,可能还有一些错误检查以确保输入是您期望的格式。
    • 输入和输出是 OP 想要的,因为两者都在问题中指定。我用了两行使其更具可读性。我在发布之前确实检查了它-> jsfiddle.net/1d5hf8sz
    • 我不是说你错了。我是说这种晦涩程度的代码应该包含 cmets,以便向未来的开发人员解释其操作。错误检查是为了确保源数据格式没有从其他地方的代码中改变,这可能会导致这里出现意外行为。
    • 重新格式化字符串只需要一个split(或match)加上一个格式化语句。调用 6 种方法来做到这一点似乎并不明智。
    • 这是一个糟糕的答案,JavaScript 内置了很多更简洁的方法来处理文本格式的日期。 -1.
    【解决方案4】:

    这可以解决你的问题

    var date = new Date('2015-11-09T10:46:15.097Z');
    alert((date.getMonth() + 1) + '/' + date.getDate() + '/' +  date.getFullYear());
    

    输出将是“2015 年 9 月 11 日”

    【讨论】:

      【解决方案5】:

      对于日期操作momentjs 库非常有用。

      如果您想让日期格式取决于用户所在的国家/地区,您还可以使用formatjs

      【讨论】:

      • 这不是答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多