2017-04-12 62 views
0

服务器使用+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中创建相同的日期和时间,忽略时区偏移量?

+0

的日期表示时间的同一时刻。删除时区偏移意味着它将代表每个时区具有不同偏移的不同时刻。 – RobG

回答

1

你options.startDate有日期是正确的。你想要显示它,就好像你来自与服务器相同的时区。 如果你现在在客户端脚本中的服务器的时区,那么我会考虑使用库如moment.js。它可以让你在你想要的时区格式化日期(格林尼治标准时间或者服务器)。

同时使用moment.js和它的插件时区代码可能是:

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

我知道这是从Javascript的角度来看是正确的,但我需要4月12日,而不是4月11日 –

+1

请问为什么?人们通常认为他们需要在与服务器相同的时区显示日期,但通常不需要,原因是他们糟糕地配置了他们的服务器/应用程序。如果你想这样做,我给你的答案:) –

+0

嗯,我有一个日历,用户选择一个交货日期,例如。所以我设置了可用日期的时间间隔。这个日期时间的一部分是不相关的,我只对真正的日期真正感兴趣。 –

0

我真的建议@VictorDrouin他的答案。

但是,如果由于某种原因,你不想moment.js或摆弄它,你可以用这个“黑客”

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));

+0

函数的主体可以是'new Date(stringdate.substr(0,19))'。 * Date.parse *和Date构造器解析字符串的方式完全相同,唯一的区别是一个返回一个时间值,另一个字符串。此外,您将在Safari和Firefox中获得不同的结果。 – RobG

+0

它可能是,但我更喜欢测试一个特定的格式。我总是希望验证输入。这样,没有意料之外的输入就会因为不允许而滑落。用我目前的身体,你可以要求只有那种类型的dateformat可以接受这个功能,这可以消除很多障碍 – Tschallacka

+0

如果你的* match *没有,那么上面的代码会抛出一个错误,所以你应该处理它。即使如此,不需要* Date.parse *所以'返回新日期(匹配)',你仍然会在不同的浏览器中获得差异。 – RobG

0

你不应该使用日期构造函数或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());

相关问题