奇怪的javascript算术行为(是的,这是意料之中的)
好的,我正在编写一个小代码片段来获取昨天的ISO日期格式值 代码: 上述代码输出2009-111-23。显然,它没有将dateString.getMonth()视为一个intiger并在其末尾加上1 在dateString.getDate()前面加上“-”+,是否会将getDate()转换为字符串 这项工作得到了预期的结果奇怪的javascript算术行为(是的,这是意料之中的),javascript,math,Javascript,Math,好的,我正在编写一个小代码片段来获取昨天的ISO日期格式值 代码: 上述代码输出2009-111-23。显然,它没有将dateString.getMonth()视为一个intiger并在其末尾加上1 在dateString.getDate()前面加上“-”+,是否会将getDate()转换为字符串 这项工作得到了预期的结果 var dateString = new Date(); var yesterday = dateString.getFullYear() + "-"; yest
var dateString = new Date();
var yesterday = dateString.getFullYear() + "-";
yesterday += dateString.getMonth()+1+ "-";
yesterday += dateString.getDate()-1;
//yesterday = 2009-12-22
虽然我真的不喜欢它的样子。。。没什么大不了的
有谁能向我解释为什么javascript会这样做?为什么会发生这种情况,有什么解释吗 它不起作用。在任何一个月的第一个月试用,你都会看到它像昨天一样报道“2009-12-0” 试着这样做:
var mydate = new Date();
mydate.setDate(mydate.getDate()-1);
document.write(mydate.getFullYear() + "-" + (mydate.getMonth()+1) + "-" + mydate.getDate() );
这是关于运算符是左关联的,所以
"-"+dateString.getMonth() + 1
与
("-"+dateString.getMonth()) + 1
在要首先计算的表达式周围加上括号:
"-" + (dateString.getMonth() + 1)
是,“-”+dateString.getMonth()
强制转换为字符串,因为其中一个参数是字符串。因此,当您添加1时,它只是附加到字符串中。这并不奇怪——几乎每种动态类型语言都是这样工作的
使用括号应该可以:
yesterday += "-"+(dateString.getMonth()+1);
yesterday += "-"+(dateString.getDate()-1);
您已经正确理解了它——Javascript首先计算赋值的右侧,看到“-”字符,并承诺其他所有内容都将转换为字符串值 在第一个代码示例中,您可以通过使用括号来防止过早强制转换来获得所需的内容,如所示:
var dateString = new Date();
var yesterday = dateString.getFullYear();
yesterday += "-" + (dateString.getMonth() + 1);
yesterday += "-" + (dateString.getDate() - 1);
当然,您仍然会遇到一个问题,即您报告的月份天数为零--
getDate()
不是零索引的。:) 简而言之,JavaScript是弱类型的。这意味着直到运行时它才确定var是文本还是数字。正因为如此,行动的顺序很重要。看起来其他的海报都谈到了关联性
请记住,JavaScript是一种函数式语言,不是面向对象的语言,因此没有您所知道的强制转换(尽管我认为可能有一些实用程序函数迫使JavaScript将某个东西视为一个数字-我记不得了)。获取表示“昨天”的日期值的正确方法是:
从那里您可以获得感兴趣的值,如
昨天.getDate()
,。正如Kieveli提到的,这在本月的第一个月不起作用。取而代之的是,获取自纪元以来的基本毫秒数并减去一天的值:
var dateobj = new Date();
var yesterdayms = dateobj.valueOf() - (24*60*60*1000);
var yesterdayobj = new Date(yesterdayms);
var yesterdaydatestring = yesterdayobj.getFullYear() + "-"
+ (yesterdayobj.getMonth()+1) + "-"
+ yesterdayobj.getDate();
试试这个:
<script type="text/javascript">
var d = new Date();
document.writeln ("Today: " + d + "<br/>Yesterday:");
d.setDate(d.getDate()-1);
document.writeln (d);
</script>
var d=新日期();
document.writeln(“今天:+d+”
昨天:);
d、 setDate(d.getDate()-1);
书面文件n(d);
编辑
或者这个:
<script type="text/javascript">
var d = new Date();
document.writeln ("Today: " + (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear() );
d.setDate(d.getDate()-1);
document.writeln ("<br/>Yesterday: " + (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear() );
</script>
var d=新日期();
document.writeln(“今天:”+(d.getDate()+1)+“-”+(d.getMonth()+1)+“-”+d.getFullYear());
d、 setDate(d.getDate()-1);
document.writeln(“
昨天:”+(d.getDate()+1)+“-”+(d.getMonth()+1)+“-”+d.getFullYear());
更直接的方法是获取昨天的日期方法,而不是从今天的日期中减去值
var d = new Date();
d.setDate(d.getDate()-1); //yesterday
var isodatestring= [d.getUTCFullYear(),
d.getUTCMonth(),d.getUTCDate()].join('-');
好电话。。。我会想办法的——有效与否。为什么会这样?你可能应该在评论栏下发布类似的内容。。。正确的?(此网站新手…不确定这是否是常见做法)您正在考虑
Number()
。谢谢-如果是本月的第一天,这会说明问题吗?是的。您要做的是将“今天”表示为自纪元以来的毫秒数,减去一天中的毫秒数,然后使用日期构造函数为您完成其余的工作。这是一个更好的处理日期算术的方法,而不是自己尝试特殊情况下的所有事情。我认为如果是本月的第一天,这将无法正常工作。。。可能是错的
<script type="text/javascript">
var d = new Date();
document.writeln ("Today: " + d + "<br/>Yesterday:");
d.setDate(d.getDate()-1);
document.writeln (d);
</script>
<script type="text/javascript">
var d = new Date();
document.writeln ("Today: " + (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear() );
d.setDate(d.getDate()-1);
document.writeln ("<br/>Yesterday: " + (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear() );
</script>
var d = new Date();
d.setDate(d.getDate()-1); //yesterday
var isodatestring= [d.getUTCFullYear(),
d.getUTCMonth(),d.getUTCDate()].join('-');