javascript函数toLocaleDateString()的日期错误

javascript函数toLocaleDateString()的日期错误,javascript,string,date,locale,Javascript,String,Date,Locale,我在项目中使用Date类toLocaleDateString()的javascript函数,根据用户的区域设置获得适当的格式,非常简单。然而,一个月的哪一天并不总是正确的(有时比预期的少一天)。我似乎无法理解为什么会发生这种情况 我构建了一个jsfiddle来展示这个问题。它发生在十月。日期应该是3,就像其他月份一样,但不知怎么的,它是2 下面是代码的重要部分和结果(我的区域设置为“de”): for(变量i=0;i

我在项目中使用Date类toLocaleDateString()的javascript函数,根据用户的区域设置获得适当的格式,非常简单。然而,一个月的哪一天并不总是正确的(有时比预期的少一天)。我似乎无法理解为什么会发生这种情况

我构建了一个jsfiddle来展示这个问题。它发生在十月。日期应该是3,就像其他月份一样,但不知怎么的,它是2

下面是代码的重要部分和结果(我的区域设置为“de”):

for(变量i=0;i<12;i++)
{
var d=新日期(1993年,i,3);
var n=d.toLocaleDateString();
document.getElementById(“demo”).innerHTML+=n+“
”; } 3.1.1993 3.2.1993 3.3.1993 3.4.1993 3.5.1993 3.6.1993 3.7.1993 3.8.1993 3.9.1993 2.10.1993 3.11.1993 3.12.1993
你们知道这里发生了什么吗?我能做些什么来解决它


多谢各位

对我来说首先是法语。浏览器的语言设置似乎以一种奇怪的方式影响结果。
检查您的浏览器语言设置。

首先适用于法语。浏览器的语言设置似乎以一种奇怪的方式影响结果。
检查你的浏览器语言设置。

我想尖头用他的评论把它钉牢了。toLocalDateString肯定会将DST分解为假定的00:00:0000小时,因为它没有被指定,所以“后退”小时会进入前一天。我不确定你的地区是什么,只有一个月的时间,但我不是一个专业的时区。这个剧本对我来说非常合适

更新:如果这不是您想要的行为,请将新日期中的“时间”设置为中午。。这样,夏令时调整就不会在不同的日期来回调整

var d = new Date(1993,i,3, 12,30,30,30);

我想尖头用他的评论说得很对。toLocalDateString肯定会将DST分解为假定的00:00:0000小时,因为它没有被指定,所以“后退”小时会进入前一天。我不确定你的地区是什么,只有一个月的时间,但我不是一个专业的时区。这个剧本对我来说非常合适

更新:如果这不是您想要的行为,请将新日期中的“时间”设置为中午。。这样,夏令时调整就不会在不同的日期来回调整

var d = new Date(1993,i,3, 12,30,30,30);
在Firefox(60)上,这在从数字初始化日期时不会显示(我的时区是GMT-3:观察
date
初始值设定项如何自动添加3小时):

但是,从字符串初始化时,会出现以下问题:

>> d = new Date("2019-10-17");
Date 2019-10-17T00:00:00.000Z
>> console.log(d.toLocaleDateString('de'))
16.11.2019
我发现可以解决这个问题的方法是手动将时区指定为UTC:

>> console.log(d.toLocaleDateString('de', {timeZone: "UTC"}))
17.10.2019
在Firefox(60)上,这在从数字初始化日期时不会显示(我的时区是GMT-3:观察
date
初始值设定项如何自动添加3小时):

但是,从字符串初始化时,会出现以下问题:

>> d = new Date("2019-10-17");
Date 2019-10-17T00:00:00.000Z
>> console.log(d.toLocaleDateString('de'))
16.11.2019
我发现可以解决这个问题的方法是手动将时区指定为UTC:

>> console.log(d.toLocaleDateString('de', {timeZone: "UTC"}))
17.10.2019

1993年,你们当地的“夏令时”(或“夏令时”)是什么时候结束的?是在9月26日。事实上,当我把日期定在27号时,我得到了9月和10月的26号。你在正确的轨道上!“…根据用户的区域设置获取正确的格式…”。无法保证会发生这种情况,因为toLocaleDateString完全依赖于实现,有些实现似乎完全忽略了用户设置。您所在地区的“夏季”(或“夏令时”)于1993年何时结束?是在9月26日。事实上,当我把日期定在27号时,我得到了9月和10月的26号。你在正确的轨道上!“…根据用户的区域设置获取正确的格式…”。无法保证会发生这种情况,因为toLocaleDateString完全依赖于实现,有些实现似乎完全忽略了用户设置。在更改的确切时刻如何处理对DST的更改因实现而异。将小时设置为午夜后一个或多个小时的任何时间就足够了,因为任何地方的变化都不会超过一个小时(有些变化小于一个小时),因此
新日期(1993,i,3,1)
就足够了。;-)在具体的变更时刻如何处理DST的变更在不同的实现中有所不同。将小时设置为午夜后一个或多个小时的任何时间就足够了,因为任何地方的变化都不会超过一个小时(有些变化小于一个小时),因此
新日期(1993,i,3,1)
就足够了。;-)在方法名称中使用“Locale”是一个误称。toLocaleString方法完全依赖于实现,并且不考虑“区域设置”,否则它们将根据设备的地理位置而不是用户设置(如果它们使用任何设置的话,它们实际上似乎就是这样做的)来更改字符串的格式在方法中,名称用词不当。toLocaleString方法完全依赖于实现,不考虑“locale”,否则它们将根据设备的地理位置而不是用户设置(如果它们使用任何设置,它们实际上似乎就是这样做的)更改字符串的格式解决方案更加优雅,适用于Chrome!执行此操作时,我会丢失“选项”格式,因为date.toLocaleDateString只接受2个参数,第一个参数必须是区域设置(或未定义)。然而,这一天是正确的。使用Nuxt,将db.js中的时区设置为“utc”没有任何区别。。对我来说(在MN,DST中)是在Date.UTC(yyyy,mm,dd,hr)中添加了一个小时参数12。添加3没有做到这一点;{timeZone:“UTC”}解决方案更加优雅,可以在Chrome上运行!执行此操作时,我会丢失“选项”格式,如date.toLocaleDateStri