创建日期会自动将一小时添加到我的输入日期
Posted
技术标签:
【中文标题】创建日期会自动将一小时添加到我的输入日期【英文标题】: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(祖鲁时区)
没有问题,你只是错过了时区的变化。
【参考方案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
之间的毫秒差值跨度>
以上是关于创建日期会自动将一小时添加到我的输入日期的主要内容,如果未能解决你的问题,请参考以下文章
NSDate: 我只输入utc时间成分,并正确设置日历,但NSDate不知为何会被重新计算到我的时区。