【问题标题】:Display "hours and minutes" works on all browsers except safari. JavaScript Date显示“小时和分钟”适用于除 safari 之外的所有浏览器。 JavaScript 日期
【发布时间】:2018-08-06 12:47:57
【问题描述】:

我从一个循环中的对象收到一个日期,格式如下:2018-08-06 20:45:00

而且我想在客户端的时区中只显示“20:45”(总是用两位数表示分钟)。我在 vue.js 的方法部分创建了这个方法:

ihaveadate(dateFromLoop) {
  var d = new Date(dateFromLoop);
  d.setTime(d.getTime() + new Date().getTimezoneOffset() * 60 * 1000);
  var hour = d.getUTCHours();
  var minutes = (d.getMinutes() < 10 ? "0" : "") + d.getMinutes();
  return `${hour}:${minutes}`;
}

除了在 safari 上我有 NaN:NaN 之外,它似乎工作正常,有没有解决这个问题的干净方法?

在阅读了你的答案后,我做到了:

var dateFromLoop = '2018-08-06 20:45:00';
var date = Date.parse(dateFromLoop.replace(" ", "T"));
const daty = new Intl.DateTimeFormat({
  hour: "numeric",
  minute: "numeric"
}).format(date);
console.log(daty);

【问题讨论】:

  • 相应的帖子可能会对您有所帮助stackoverflow.com/questions/4310953/invalid-date-in-safari
  • 您的解决方案在 Safari 中不起作用,对我来说它返回“07/08/2018”。时间戳“2018-08-06 20:45:00”没有关联的时区,因此无论主机的时区如何,时间都应始终为“20:45”。但是 Safari 的解析器有问题,“2018-08-06T20:45:00”将被视为 UTC,而不是本地,所以不要相信它。您的答案代码无法编译,它有语法错误和错误。
  • 因为我只收到 2018-08-06 20:45:00 我这样做了: const loopy = dateFromLoop.replace(" ", "T") + ".000+02:00"; var date = Date.parse(loopy); const 日期 = new Intl.DateTimeFormat(locale, { 小时:“数字”,分钟:“数字”}).format(date);返回日期;

标签: javascript date datetime vue.js


【解决方案1】:

是的,这不适用于 safari,至于 ECMAScript 5 ISO-8601 format support

或者,日期/时间字符串可以是 ISO 8601 格式。为了 例如,“2011-10-10”(仅日期)或“2011-10-10T14:48:00”(日期和 time) 可以传递和解析。

您需要在日期时间中包含 T 才能使其在 Safari 上运行:

new Date('2014-02-18T15:00:48');

你可以尝试这样做:

new Date(dateFromLoop.replace(/\s/, 'T');

【讨论】:

  • 这仍然会在 Safari 中产生错误的结果。
  • 这是否取决于 safari 的版本,因为我看到 20:45 在我这边?
  • @yoyojs——是的(在当前版本的 v 13.2.1 中测试)。 '2014-02-18T15:00:48' 应该被解析为本地,因此应该返回相同的本地日期和时间(即 2014 年 2 月 18 日 15:00:48,无论本地时区如何),但 Safari 将其视为 UTC,因此偏移量不是 +0 的任何人的不同时间。
【解决方案2】:

对于干净的解决方案 有一个名为 moment 的库,您可以使用它进行所有时间和日期操作

解决你的问题

const d = new Date(yourDate);
const hourAndMin = moment().format('h:mm'); 

参考Moment

【讨论】:

    【解决方案3】:

    您可以为此使用香草。

    docs for parse

    docs for format

    示例直接来自源代码

    var date = Date.parse('2018-08-06 20:45:00'.replace(' ', 'T'));
    
    // toLocaleString without arguments depends on the implementation,
    // the default locale, and the default time zone
    console.log(new Intl.DateTimeFormat({
      hour: 'numeric',
      minute: 'numeric'
    }).format(date));

    【讨论】:

    • 这很好,但我有两个小时的 safari 轮班。我在文档中读到我可以找到像这样的用户时区 var tz = Intl.DateTimeFormat().resolvedOptions().timeZone;但我不知道如何在我的 DateTimeFormat 中传递它
    • 我不明白为什么这是公认的答案。结果在 Safari 11 中是“07/08/2018”,OP 想要“20:45”。 Safari 的解析器有问题,“2018-08-06T20:45:00”被错误地解析为 UTC,因此在使用本地方法时它会得到错误的时间和错误的日期,具体取决于主机时区偏移量。
    • 因为,操作将其调暗为接受的答案,仅此而已。它满足了他的需求,那么你为什么要质疑一个人的意见和决定呢?你不是问题的对象。
    • @BarrJ——它根本不能满足 OP 的需求。它会产生错误的结果,并且在 Safari 中与其他浏览器的解析方式不同(如果它确实显示了时间,它会显示错误的时间,而对我来说,它也会显示错误的日期)。如果 OP 没有意识到这些错误,不指出它们将是失职。
    • 但在 safari 上我看到“20:45”而不是“07/08/2018”,我是不是错过了什么?
    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2013-09-17
    • 2016-05-10
    相关资源
    最近更新 更多