我想在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现在将显示原始日期,没有任何时区差异。即使日光时间的变化也不会对日期对象产生任何影响,因为我们手动设置了原始的小时和分钟。

希望这能有所帮助。

其他回答

这里有一个简单的解决方案:

const handler1 = {
  construct(target, args) {
    let newDate = new target(...args);
    var tzDifference = newDate.getTimezoneOffset();
    return new target(newDate.getTime() + tzDifference * 60 * 1000);
  }
};

Date = new Proxy(Date, handler1);

(新日期().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

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

日期被正确解析,只是toString将其转换为您的本地时区:

let s = "2005-07-08T11:22:33+0000"; let d = new Date(Date.parse(s)); //此日志为我 //“2005年7月8日星期五13:22:33 GMT+0200(中欧夏季时间)” //和其他东西给你 console.log (d.toString ()) //此日志 //星期五,2005年7月8日11:22:33 GMT // for everyone console.log (d.toUTCString ())

Javascript Date对象是时间戳-它们只包含从epoch开始的毫秒数。Date对象中没有时区信息。这个时间戳代表哪个日历日期(日、分、秒)是一个解释问题(其中一个是…字符串方法)。

上面的例子显示日期被正确地解析了——也就是说,它实际上包含了一个毫秒数,对应于GMT的"2005-07-08T11:22:33"。

Date对象本身无论如何都将包含timezone,返回的结果是以默认方式将其转换为字符串的结果。也就是说,你不能创建一个没有时区的日期对象。但是您可以通过创建自己的Date对象来模仿Date对象的行为。 然而,这最好交给像moment.js这样的库。

您可以使用此代码

var stringDate = "2005-07-08T00:00:00+0000";
var dTimezone = new Date();
var offset = dTimezone.getTimezoneOffset() / 60;
var date = new Date(Date.parse(stringDate));
date.setHours(date.getHours() + offset);