javascript中的日期操作

javascript中的日期操作,javascript,jquery,html,date,Javascript,Jquery,Html,Date,我有一个字符串,例如“2016年11月8日-2016年12月7日”,我想以这种格式提取两个日期:yyy-MM-DD。 现在,我通过以下方式以我想要的格式获得了日期: HTML: 2016年11月8日至2016年12月7日 Javascript: date = $('#selecDate').text().split('-'); begin = new Date(date[1]); begin = begin.toISOString().split('T')[0]; 问题在于date=[“201

我有一个字符串,例如
“2016年11月8日-2016年12月7日”
,我想以这种格式提取两个日期:yyy-MM-DD。 现在,我通过以下方式以我想要的格式获得了日期:

HTML:

2016年11月8日至2016年12月7日

Javascript:

date = $('#selecDate').text().split('-');
begin = new Date(date[1]);
begin = begin.toISOString().split('T')[0];
问题在于
date=[“2016年11月8日”、“2016年12月7日”]

begin=“2016年12月7日星期三00:00:00 GMT+0200(IST)”

当在第二行但在最后一行时,begin的值变为一天前的“2016-12-06”。你知道我怎样才能避免吗


我在(GMT+02:00)时区工作,执行
toISOString()
返回的日期是UTC时间,因此需要返回2小时(因为您当前的时区)。IST中12月6日的午夜是前一天UTC时间的22:00

如果希望将时间戳保留在本地时间,可以在日期对象上使用
.toLocaleDateString()
toLocaleString()
或甚至只使用
.toString()

begin = new Date('December 7, 2016').toLocaleDateString();
请注意,日期格式略有不同:

a、 toLocaleDateString()
“12/7/2016”

a、 toLocaleString()
“2016年7月12日,上午12:00:00”

a、 toString()
“2016年12月7日星期三00:00:00 GMT+0200(IST)”


执行
toISOString()
时,返回的日期是UTC时间,因此需要返回2小时(因为您当前的时区)。IST中12月6日的午夜是前一天UTC时间的22:00

如果希望将时间戳保留在本地时间,可以在日期对象上使用
.toLocaleDateString()
toLocaleString()
或甚至只使用
.toString()

begin = new Date('December 7, 2016').toLocaleDateString();
请注意,日期格式略有不同:

a、 toLocaleDateString()
“12/7/2016”

a、 toLocaleString()
“2016年7月12日,上午12:00:00”

a、 toString()
“2016年12月7日星期三00:00:00 GMT+0200(IST)”

正如MDN在中所述,方法:

时区始终为零UTC偏移

当您创建新日期('2016年12月7日')时,您得到的是:

2016年12月7日星期三00:00:00 GMT+0200

因此,在UTC中,小时数减去2,即前一天

解决方案

begin = begin.getFullYear() + '-' + (begin.getMonth() + 1) + '-' + begin.getDate();
结果将是:“2016-12-07”。

正如MDN在方法中所说:

时区始终为零UTC偏移

当您创建新日期('2016年12月7日')时,您得到的是:

2016年12月7日星期三00:00:00 GMT+0200

因此,在UTC中,小时数减去2,即前一天

解决方案

begin = begin.getFullYear() + '-' + (begin.getMonth() + 1) + '-' + begin.getDate();

将导致:“2016-12-07”。

您不应使用日期构造函数解析字符串,尤其是当字符串的格式不是ECMA-262中指定的格式时,因为其行为取决于实现

如果您需要日期对象,您应该使用一个库(例如),并提供解析格式,或者编写一个简单函数将格式解析为日期(见下文)

但是,如果您只需要不同格式的字符串,只需重新格式化该字符串并完全避免日期:

//以MMMM d,yyyy到yyy-mm-dd格式重新格式化日期字符串
函数重新格式化日期{
var b=s.match(/\w+/g)| |[];
变量月份={1月:'01',2月:'02',3月:'03',4月:'04',5月:'05',6月:'06',
七月七日,八月八日,九月九日,十月十日,十一月十一日,十二月十二日;
返回b.length==3?b[2]+'-'+
月[b[0].toLowerCase().substr(0,3)]+'-'+
('0'+b[1])。切片(-2):“”;
}
控制台日志(重新格式化日期('2016年11月8日'))

不应使用日期构造函数解析字符串,尤其是当字符串不是ECMA-262中指定的格式时,因为其行为取决于实现

如果您需要日期对象,您应该使用一个库(例如),并提供解析格式,或者编写一个简单函数将格式解析为日期(见下文)

但是,如果您只需要不同格式的字符串,只需重新格式化该字符串并完全避免日期:

//以MMMM d,yyyy到yyy-mm-dd格式重新格式化日期字符串
函数重新格式化日期{
var b=s.match(/\w+/g)| |[];
变量月份={1月:'01',2月:'02',3月:'03',4月:'04',5月:'05',6月:'06',
七月七日,八月八日,九月九日,十月十日,十一月十一日,十二月十二日;
返回b.length==3?b[2]+'-'+
月[b[0].toLowerCase().substr(0,3)]+'-'+
('0'+b[1])。切片(-2):“”;
}
控制台日志(重新格式化日期('2016年11月8日'))

其中没有一个返回所需的格式。非ISO 8601字符串的解析依赖于实现,不应依赖于实现。所有解析都不会返回所需的格式。非ISO 8601字符串的解析依赖于实现,不应依赖于实现。