JavaScript-javascript 中使用 setFullYear() 函数出现的问题

JavaScript-javascript 中使用 setFullYear() 函数出现的问题

想挽留 发布于 2017-04-29 字数 300 浏览 1065 回复 2

在开发中遇到这样的一个问题,将代码简化为以下:

var d = new Date();
//d.setFullYear(2012,3,8); //2012年4月8日星期日
d.setFullYear(parseInt("2012"), parseInt("03"), parseInt("08")); //2012年3月31日星期六
alert(d.toLocaleDateString())

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

偏爱自由 2017-07-08 2 楼

setFullYear()方法的第二个参数month的取值范围是0-11,0代表1月,而你这里parseInt('03')返回的是3,是代表的4月份,所以会返回“2012年4月8日”,所以月份需要减1才是正确的

<script language="javascript">
var d = new Date();
//d.setFullYear(2012,3,8); //2012年4月8日
d.setFullYear(parseInt("2012"), parseInt("03")-1, parseInt("13")); //2012年3月8日
alert(d.toLocaleDateString());
</script>

针对你的评论,建议你检查一下你的环境,至少在我这里测试是完全正确的

var d = new Date();
d.setFullYear(2012,3,13); //2012年4月13日
console.log(d.toLocaleDateString());

d.setFullYear(parseInt("2012"), parseInt("03"), parseInt("13")); //2012年4月13日
console.log(d.toLocaleDateString());

归属感 2017-07-07 1 楼

js parseInt的陷阱分析,当第一个字符为0时,Js会把它看成一个8进制数字,其他8进制之外的字符都回被忽略掉。首先咱看一下parseInt这个函数:
parseInt语法:

parseInt(string, radix);

其中string为要转换的字符串,radix为二进制,八进制,十六进制或十进制。
在默认不指定radix时,当以0x开关时,为十六进制;如果以0开头且第二位不为x,则认为是八进制,(因为八进制不能有8,9所以报错返回0)。

所以上面parseInt("08")返回的是0而不是你想要的8

d.setFullYear(parseInt("2012"), parseInt("03"), parseInt("08"));

最终结果是这样的:

d.setFullYear(2012, 3, 0);