好的,我正在编写一些代码片段来获取昨天的 ISO 日期格式值。
代码:
var dateString = new Date();
var yesterday = dateString.getFullYear();
yesterday += "-"+dateString.getMonth()+1;
yesterday += "-"+dateString.getDate()-1;
上面的代码输出2009-111-23。 它显然没有将 dateString.getMonth() 视为整数并在其末尾添加 1。
在 dateString.getDate() 前面添加“-”+是否会将 getDate() 转换为字符串?
这个作品得到了想要的结果。
var dateString = new Date();
var yesterday = dateString.getFullYear() + "-";
yesterday += dateString.getMonth()+1+ "-";
yesterday += dateString.getDate()-1;
//yesterday = 2009-12-22
虽然我不太喜欢它的样子……但没什么大不了的。
任何人都可以向我解释为什么 javascript 会这样吗?有什么解释为什么会发生这种情况吗?
这是关于关联性。 + 运算符是左结合的,所以
"-"+dateString.getMonth() + 1
与
相同("-"+dateString.getMonth()) + 1
在您想要首先计算的表达式两边加上括号:
"-" + (dateString.getMonth() + 1)
获取代表“昨天”的日期值的正确方法是:
var today = new Date();
var yesterday = new Date(today.getTime() - (1000*60*60*24));
从那里您可以获得感兴趣的值,例如
yesterday.getDate()
,。
这不起作用。 在任何一个月的第一天尝试一下,您会得到它报告“2009-12-0”就像昨天一样。
尝试这样的事情:
var mydate = new Date();
mydate.setDate(mydate.getDate()-1);
document.write(mydate.getFullYear() + "-" + (mydate.getMonth()+1) + "-" + mydate.getDate() );
简而言之,JavaScript 是弱类型的。这意味着它直到运行时才确定 var 是文本还是数字。因此,操作顺序很重要。看起来其他海报都谈到了关联性。
请记住,JavaScript 是一种函数式语言,而不是面向对象的语言,因此没有您所知道的强制转换(尽管我认为可能有一些实用函数可以强制 JavaScript 将某些内容视为数字 - 我不记得了我的头顶)。
是的,
"-" + dateString.getMonth()
转换为字符串,因为参数之一是字符串。 因此,当您添加 1 时,它只是附加到字符串中。 这并不奇怪——这就是几乎所有动态类型语言的工作方式。
使用括号应该有效:
yesterday += "-"+(dateString.getMonth()+1);
yesterday += "-"+(dateString.getDate()-1);
var dateString = new Date();
var yesterday = dateString.getFullYear();
yesterday += "-"+String(parseInt(dateString.getMonth())+1);
yesterday += "-"+String(parseInt(dateString.getDate())-1);
您已经正确理解了它——Javascript 首先评估赋值的右侧,看到“-”字符,并承诺其他所有内容都将转换为字符串值。
在您的第一个代码示例中,您可以通过使用括号来防止过早转换来获得您想要的内容,如下所示:
var dateString = new Date();
var yesterday = dateString.getFullYear();
yesterday += "-" + (dateString.getMonth() + 1);
yesterday += "-" + (dateString.getDate() - 1);
当然,您仍然会遇到一个问题,即报告月份中为零的天数 -
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>
编辑
或者这个:
<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('-');