如何从字符串创建日期,忽略任何时区偏移?

时间:2017-04-12 15:37:59

标签: javascript date

服务器使用+03:00时区。它以这种格式提供了一个日期:"2017-04-12T00:00:00+03:00"

然后我从这个字符串创建一个新日期:

options.startDate = new Date("2017-04-12T00:00:00+03:00")

但是因为在客户端有一个不同的时区,结果实际上是:

Tue Apr 11 2017 23:00:00 GMT+0200 (Central Europe Daylight Time)

这让我有一天回来,对我来说这是一件大事。是否有一种优雅的方法来避免这种情况并在javascript中创建相同的日期和时间,忽略时区偏移量?

3 个答案:

答案 0 :(得分:1)

您在options.startDate中的日期是正确的。你想要的是显示它,就好像你来自服务器的同一时区。 如果您现在在客户端脚本中使用服务器的时区,那么我会考虑使用像moment.js这样的库。它允许您在所需的时区格式化日期(例如GMT,或服务器之一)。

同时使用moment.js及其插件时区代码可能是:

moment("2017-04-12T00:00:00+03:00").tz("America/Los_Angeles").format();

答案 1 :(得分:0)

我真的推荐@VictorDrouin他的回答。

但是如果由于某种原因你不想要片刻或者摆弄它,你可以使用这个' hack'

new Date("2017-04-12T00:00:00+03:00".match(/\d{4}\-\d{2}\-\d{2}T\d{2}:\d{2}:\d{2}/).pop());

它的作用是将日期与给定的正则表达式日期格式相匹配,然后将其提供给日期解析器,使其成为日期。

将数据提供给您提供给它的数据库时要小心,不要有时区偏移。



var stringdate = "2017-04-12T00:00:00+03:00";
function getDate(str_date) {
    var matched = str_date.match(/\d{4}\-\d{2}\-\d{2}T\d{2}:\d{2}:\d{2}/).pop();
    return new Date(matched);
}
console.log(getDate(stringdate));




答案 2 :(得分:0)

由于浏览器差异,您不应该使用Date构造函数或Date.parse来解析字符串。即使从字符串中删除时区并解析其余部分,例如



console.log( new Date('2017-04-12T00:00:00+03:00'.substr(0,19)).toString() );




您会在不同的浏览器中获得不同的结果(例如Firefox和Safari)。

如果您不想使用库,请使用简单的功能(见下文)。但是,如果删除时区,则字符串将表示每个时区中具有不同偏移的不同时刻。



function parseISOIgnoreTimezone(s) {
  var b = s.split(/\D/);
  return new Date(b[0], b[1]-1, b[2], b[3], b[4], b[5]);
}

console.log(parseISOIgnoreTimezone('2017-04-12T00:00:00+03:00').toString());