2009-12-23 21 views
4

好的,我正在写一些代码片段来获取昨天的ISO日期格式值。奇怪的JavaScript算术行为(yup ...预计)

代码:

var dateString = new Date(); 

var yesterday = dateString.getFullYear(); 

    yesterday += "-"+dateString.getMonth()+1; 

    yesterday += "-"+dateString.getDate()-1; 

上面的代码输出2009-111-23。显然不是将dateString.getMonth()当作一个intiger,并且在它的最后加上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的行为是这样的?有什么解释为什么发生这种情况?

回答

13

这是关于associativity。 +运算符是左关联的,所以

"-"+dateString.getMonth() + 1 

是一样围绕你想表达

("-"+dateString.getMonth()) + 1 

认沽括号先计算:

"-" + (dateString.getMonth() + 1) 
2

它不起作用。在任何一个月的第一天尝试一下,你会得到它昨天报告“2009-12-0”。

尝试这样:

var mydate = new Date(); 
mydate.setDate(mydate.getDate()-1); 
document.write(mydate.getFullYear() + "-" + (mydate.getMonth()+1) + "-" + mydate.getDate()); 
+0

好的呼叫...我会想出一些东西 - 有效与否。为什么它的行为如此? 你应该发布这样的评论中的东西...对吗? (新的这个网站......不知道这是否是通常的做法) – 2009-12-23 15:05:19

0

是,"-" + dateString.getMonth()强制转换为字符串,因为其中一个参数是一个字符串。那么当你添加1时,它只是附加到字符串中。这并不奇怪 - 这就是几乎所有动态类型的语言都会起作用的。

使用括号应该工作:

yesterday += "-"+(dateString.getMonth()+1); 

    yesterday += "-"+(dateString.getDate()-1); 
0
var dateString = new Date(); 

var yesterday = dateString.getFullYear(); 

    yesterday += "-"+String(parseInt(dateString.getMonth())+1); 

    yesterday += "-"+String(parseInt(dateString.getDate())-1); 
0

你明白它正确已经 - 使用Javascript首先计算分配的右侧,看到了“ - ”字符,并承诺这一切将是铸造成一个字符串值。

在你的第一个代码示例,你可以得到你想要的东西用小括号,以防止过早投,如:

var dateString = new Date(); 
var yesterday = dateString.getFullYear(); 
yesterday += "-" + (dateString.getMonth() + 1); 
yesterday += "-" + (dateString.getDate() - 1); 

当然,你仍然会在那里你报出的天有一个问题该月为零 - getDate()不是零索引。 :)

1

简而言之,JavaScript是弱类型的。这意味着它不会确定var是文本还是数字,直到运行时。因此,操作顺序很重要。看起来其他海报已经谈到了关联性。请记住,JavaScript是一种功能性语言,不是面向对象的语言,所以不会像你所知道的那样投射(尽管我认为可能有一些实用功能强制JavaScript将某些东西当作一个数字 - 我可以'记住我的头顶)。

+0

你正在考虑'Number()'。 – 2009-12-23 15:07:38

3

正确的方法来获取表示“昨天”的日期值是这样的:

var today = new Date(); 
var yesterday = new Date(today.getTime() - (1000*60*60*24)); 

从那里你可以得到的利益的价值观,像yesterday.getDate()

+0

谢谢 - 这是否是本月的第一个月? – 2009-12-23 15:25:25

+0

是的。 你正在做的是从时代开始获取以“毫秒”表示的“今天”,并减去一天中的毫秒数,并使用Date构造函数为您完成剩下的工作。这是处理日期算法的好方法,而不是试图自己处理所有事情。 – 2009-12-23 15:27:34

+0

真棒。非常聪明! +1 – 2009-12-23 18:41:29

0

正如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(); 
0

试试这个:

<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> 
+0

我需要ISO格式:年 - 月 - 日 – 2009-12-23 15:22:58

+0

如果这是本月的第一个月,我认为这不会正常工作......可能是错误的 – 2009-12-23 18:43:00

0

它会更直接地得到昨天的日期方法,而不是从今天的日期减去这些值。

var d = new Date(); 
d.setDate(d.getDate()-1); //yesterday 
var isodatestring= [d.getUTCFullYear(), 
d.getUTCMonth(),d.getUTCDate()].join('-');