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字符串的解析依赖于实现,不应依赖于实现。