我想在JavaScript中解析一个没有时区的日期。我试着:

new Date(Date.parse("2005-07-08T00:00:00+0000"));

返回2005年7月8日星期五02:00:00 GMT+0200(中欧夏令时):

new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));

返回相同的结果,并且:

new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));

也返回相同的结果。

我想解析时间:

没有时区。 而不调用构造函数Date。UTC或new日期(年、月、日)。 通过简单地将一个字符串传递到Date构造函数(没有原型方法)。

我必须生成一个Date对象,而不是String对象。


当前回答

这是我想出的解决这个问题的方法,对我来说很有效。


图书馆使用:momentjs与简单的javascript日期类。

步骤1。 将字符串日期转换为moment对象(PS:只要未调用toDate()方法,moment将保留原始日期和时间):

const dateMoment = moment("2005-07-08T11:22:33+0000");

步骤2。 从之前创建的moment对象中提取小时和分钟值:

  const hours = dateMoment.hours();
  const mins = dateMoment.minutes();

步骤3。 将时间转换为日期(PS:这将根据浏览器/机器的时区更改原始日期,但不要担心,请阅读第4步):

  const dateObj = dateMoment.toDate();

步骤4。 手动设置步骤2中提取的小时和分钟。

  dateObj.setHours(hours);
  dateObj.setMinutes(mins);

第5步。 dateObj现在将显示原始日期,没有任何时区差异。即使日光时间的变化也不会对日期对象产生任何影响,因为我们手动设置了原始的小时和分钟。

希望这能有所帮助。

其他回答

解决方案几乎与@wawka的相同,但是它使用Math.abs处理不同时区的加减唱歌:

const date = new Date("2021-05-24T22:00:18.512Z")
const userTimezoneOffset = Math.abs(date.getTimezoneOffset() * 60000);
new Date(date.getTime() - userTimezoneOffset);

(新日期().toString())。替换(/ \w+-\d+ \(.*\)$/,"")

这将有输出:2018年7月10日星期二19:07:11

(新日期(“2005 - 07 - 08 - t11:22:33 + 0000”).toString())。替换(/ \w+-\d+ \(.*\)$/,"")

这将有输出:Fri july 08 2005 04:22:33

注意:返回的时间将取决于您的本地时区

我遇到了同样的问题,然后想起了我正在从事的一个遗留项目的一些问题,以及他们是如何处理这个问题的。当时我并不理解,也并不在意,直到我自己遇到了这个问题

var date = '2014-01-02T00:00:00.000Z'
date = date.substring(0,10).split('-')
date = date[1] + '-' + date[2] + '-' + date[0]

new Date(date) #Thu Jan 02 2014 00:00:00 GMT-0600

不管出于什么原因,将日期传递为“01-02-2014”将时区设置为0并忽略用户的时区。这可能是Date类中的一个侥幸,但它在一段时间以前就存在,今天也存在。而且它似乎可以跨浏览器工作。你自己试试吧。

这段代码是在一个全局项目中实现的,在这个项目中,时区很重要,但查看日期的人并不关心它被引入的确切时间。

这是我想出的解决这个问题的方法,对我来说很有效。


图书馆使用:momentjs与简单的javascript日期类。

步骤1。 将字符串日期转换为moment对象(PS:只要未调用toDate()方法,moment将保留原始日期和时间):

const dateMoment = moment("2005-07-08T11:22:33+0000");

步骤2。 从之前创建的moment对象中提取小时和分钟值:

  const hours = dateMoment.hours();
  const mins = dateMoment.minutes();

步骤3。 将时间转换为日期(PS:这将根据浏览器/机器的时区更改原始日期,但不要担心,请阅读第4步):

  const dateObj = dateMoment.toDate();

步骤4。 手动设置步骤2中提取的小时和分钟。

  dateObj.setHours(hours);
  dateObj.setMinutes(mins);

第5步。 dateObj现在将显示原始日期,没有任何时区差异。即使日光时间的变化也不会对日期对象产生任何影响,因为我们手动设置了原始的小时和分钟。

希望这能有所帮助。

我个人更喜欢@wawka的答案,然而,我也提出了一个不那么干净的技巧来解决这个问题,这是更简单的,如果你确定你想转换的字符串的格式,可以工作。

请看下面的代码片段:

var dateString = 2021- 08-02t00 var dateObj =新日期(数据+ z) 日志控制台。 var dateObjWithTZ =新日期 log控制台(“正常转换:”,dateObjWithTZ)

这在这种情况下是有效的,因为在日期时间字符串的末尾添加Z将使JS将此字符串视为UTC日期字符串,因此它不会向其添加时区差异。