Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从字符串创建日期,而忽略任何时区偏移?_Javascript_Date - Fatal编程技术网

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

Javascript 如何从字符串创建日期,而忽略任何时区偏移?,javascript,date,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) 总有一天我会回来,这对我来说是件大事。是否有一种优

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

选项中的日期。startDate是正确的日期。您想要的是将其显示为与服务器来自同一时区。 如果您现在在客户端脚本中使用服务器的时区,那么我会考虑使用类似的库。它将允许您在您想要的时区(例如GMT或服务器的时区)中格式化日期

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

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

我真的在他的回答中推荐@victordrou

但是,如果出于某种原因,你不想使用moment.js或摆弄它,你可以使用这个“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”;
函数getDate(str_date){
var matched=stru date.match(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/).pop();
返回新日期(匹配);
}

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


console.log(新日期('2017-04-12T00:00:00+03:00'.substr(0,19)).toString())从Javascript的角度来看,我知道这是正确的,但我需要的是4月12日,而不是4月11日。请问为什么?人们通常认为他们需要在与服务器相同的时区中显示日期,但这通常是不需要的,原因是他们配置了糟糕的服务器/应用程序。如果你想这样做,我给你的答案是:)嗯,我有一个日历,用户可以在日历上选择交货日期。所以我设置了一个可用日期的间隔。这个日期的时间部分与时间无关,我只对实际日期感兴趣。对不起,我来不及回答你的问题了。如果我很了解您发送给客户机的日期间隔对应于其时区中的日期间隔,那么它们应该在其时区中的服务器端生成。因此,解决问题的干净方法是编辑服务器,使其使用与客户端相关的GMT+N生成日期。函数体可以是
new Date(stringdate.substr(0,19))
。parse和日期构造函数解析字符串的方式完全相同,唯一的区别是一个返回时间值,另一个返回字符串。另外,在Safari和Firefox中也会得到不同的结果。可能是这样,但我更喜欢测试特定的格式。我总是希望验证输入。这样就不会有不允许的意外输入溜走。在我当前的主体中,您可以强制要求函数只能接受该类型的dateformat,这会删除很多错误。如果您的匹配项不匹配,则上述内容将抛出错误,因此您应该处理该错误。即使如此,也不需要Date.parse so
返回新日期(已匹配)
,在不同的浏览器中仍然会出现差异。它应该会抛出一个错误。这就是为什么你有所谓的规范,文档和行为,当给定的规范被违反时抛出错误。我没有考虑到浏览器的不同行为,我将删除解析部分,但您不处理错误,脚本将失败。日期表示时间上的同一时刻。删除时区偏移意味着它将在具有不同偏移的每个时区中表示不同的时间点。