【问题标题】:Creating a Date is adding automatically one hour to my input date创建日期会自动将一小时添加到我的输入日期
【发布时间】:2019-04-17 13:30:21
【问题描述】:

假设我输入了这个日期:

var _dateA = 2018-11-15T11:13:26.687Z

如果我在做,无论如何,

var _dateB = new Date(_date)

var _dateB = moment(_date)

我得到这个结果 ==>

_dateB = Thu Nov 15 2018 12:13:26 GMT+0100 (heure normale d’Europe centrale)

我知道存在时区问题,但我怎样才能获得 Date 对象或 Moment 对象,而无需多花一个小时呢?

想要的结果 => Thu Nov 15 2018 11:13:26 GMT+0100

当前结果 => Thu Nov 15 2018 12:13:26 GMT+0100

【问题讨论】:

  • 您没有“再过一小时”。这只是与您期望的不同的表示。但这就是它的设计方式。你在找Date.prototype.toLocaleDateString()吗?
  • 您在 GMT+0100 时区,但您输入的是 UTC(祖鲁时区)
  • 没有问题,你只是错过了时区的变化。

标签: javascript date datetime timezone momentjs


【解决方案1】:

您需要使用 Date.toUTCString() 将日期转换为字符串,使用 UTC 时区

var _dateA = '2018-11-15T11:13:26.687Z';
var _dateB = new Date(_dateA);
console.log(_dateB.toUTCString());

【讨论】:

    【解决方案2】:

    当您通过console.log()alert() 等“输出”Date 对象时,默认使用 toString() 方法,将日期对象转换为本地时区字符串以进行显示(这就是为什么以当地时间查看您的日期)。

    不建议使用Date 构造函数解析日期字符串(尽管我怀疑大多数浏览器可能会处理 ISO 8601 日期,就像您问题中的日期一样,相当好)-see the dateString parameter note here。因此,如果您需要构造一个日期对象并输出一个日期字符串,那么您可以使用多个分隔符的正则表达式字符集解析带有 split() 的 ISO 8601 字符串,然后使用 new Date(Date.UTC(...)) 构造一个 UTC 日期对象。您也可以使用 moment.js 执行此操作,但下面应该更详细地说明正在发生的事情。

    例如:

    const text = '2018-11-15T11:13:26.687Z'
    const [y, m, d, hh, mm, ss, ms] = text.split(/[-T:.Z]/);
    const date = new Date(Date.UTC(y, m - 1, d, hh, mm, ss, ms));
    console.log(date.toLocaleString()); // date string in local timezone
    console.log(date.toUTCString()); // UTC date string
    console.log(JSON.stringify(date)); // ISO 8601 date string in most browsers

    【讨论】:

    • 如果我想用 UTC 日期和 now() 做一个 diff() ?我怎样才能做到这一点?
    • @Mayoul 如果你使用上面 sn-p 中的date 并执行类似let diff = new Date() - date 的操作,那么diff 将是当前日期时间和2018-11-15T11:13:26.687Z 之间的毫秒差值跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2019-08-31
    • 2010-12-14
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多