JavaScript 从日期中减去天数

7

我尝试从一个日期减去天数的代码并没有得到正确的结果。

function get_Ash_Wednesday_date (year, Easter_month, Easter_day) {
    var Easter_date = new Date();
    Easter_date.setFullYear(year, Easter_month-1, Easter_day);
    var Ash_Wednesday = new Date();

    Ash_Wednesday.setFullYear(year);
    Ash_Wednesday.setDate(Easter_date.getDate()-46);
    return Ash_Wednesday;
}

从复活节的日期中减去46天,通常是回溯到2月份,并考虑闰年。计算的灰烬星期三日期可能会有一两天的偏差,例如2012年的灰烬星期三应该是02/22,2013年应该是02/13,2014年应该是03/05,2015年应该是02/18,2016年应该是02/10。每次都会出现错误的月份,应该是二月或三月。什么原因可以解释返回的日期和月份之间的差异?
Year: 2012 Ash Wednesday month 11 Ash Wednesday day 23 Easter Month: 4 Easter Day: 8
Year: 2013 Ash Wednesday month 12 Ash Wednesday day 16 Easter Month: 3 Easter Day: 31
Year: 2014 Ash Wednesday month 12 Ash Wednesday day 5 Easter Month: 4 Easter Day: 20
Year: 2015 Ash Wednesday month 11 Ash Wednesday day 20 Easter Month: 4 Easter Day: 5
Year: 2016 Ash Wednesday month 12 Ash Wednesday day 12 Easter Month: 3 Easter Day: 27
Year: 2017 Ash Wednesday month 12 Ash Wednesday day 1 Easter Month: 4 Easter Day: 16
Year: 2018 Ash Wednesday month 11 Ash Wednesday day 16 Easter Month: 4 Easter Day: 1
Year: 2019 Ash Wednesday month 12 Ash Wednesday day 6 Easter Month: 4 Easter Day: 21
Year: 2020 Ash Wednesday month 11 Ash Wednesday day 27 Easter Month: 4 Easter Day: 12
Year: 2021 Ash Wednesday month 11 Ash Wednesday day 19 Easter Month: 4 Easter Day: 4
Year: 2022 Ash Wednesday month 12 Ash Wednesday day 2 Easter Month: 4 Easter Day: 17
Year: 2023 Ash Wednesday month 11 Ash Wednesday day 24 Easter Month: 4 Easter Day: 9
Year: 2024 Ash Wednesday month 12 Ash Wednesday day 16 Easter Month: 3 Easter Day: 31
Year: 2025 Ash Wednesday month 12 Ash Wednesday day 5 Easter Month: 4 Easter Day: 20
Year: 2026 Ash Wednesday month 11 Ash Wednesday day 20 Easter Month: 4 Easter Day: 5
Year: 2027 Ash Wednesday month 12 Ash Wednesday day 13 Easter Month: 3 Easter Day: 28
Year: 2028 Ash Wednesday month 12 Ash Wednesday day 1 Easter Month: 4 Easter Day: 16
Year: 2029 Ash Wednesday month 11 Ash Wednesday day 16 Easter Month: 4 Easter Day: 1
Year: 2030 Ash Wednesday month 12 Ash Wednesday day 6 Easter Month: 4 Easter Day: 21
Year: 2031 Ash Wednesday month 11 Ash Wednesday day 28 Easter Month: 4 Easter Day: 13    
Year: 2032 Ash Wednesday month 12 Ash Wednesday day 13 Easter Month: 3 Easter Day: 28
Year: 2033 Ash Wednesday month 12 Ash Wednesday day 2 Easter Month: 4 Easter Day: 17
Year: 2034 Ash Wednesday month 11 Ash Wednesday day 24 Easter Month: 4 Easter Day: 9
Year: 2035 Ash Wednesday month 12 Ash Wednesday day 10 Easter Month: 3 Easter Day: 25
Year: 2036 Ash Wednesday month 11 Ash Wednesday day 28 Easter Month: 4 Easter Day: 13
Year: 2037 Ash Wednesday month 11 Ash Wednesday day 20 Easter Month: 4 Easter Day: 5
Year: 2038 Ash Wednesday month 12 Ash Wednesday day 10 Easter Month: 4 Easter Day: 25
Year: 2039 Ash Wednesday month 11 Ash Wednesday day 25 Easter Month: 4 Easter Day: 10
Year: 2040 Ash Wednesday month 11 Ash Wednesday day 16 Easter Month: 4 Easter Day: 1
Year: 2041 Ash Wednesday month 12 Ash Wednesday day 6 Easter Month: 4 Easter Day: 21
Year: 2042 Ash Wednesday month 11 Ash Wednesday day 21 Easter Month: 4 Easter Day: 6

我不理解你的输出,请解释一下:你想要它显示什么?你是如何从Ash_Wednesday创建它的?你的函数运行在什么样的循环中? - maialithar
1个回答

15

在参考资料中看到了一条注释,不要将负值传递给setDate()。

改为尝试这样做:

var Ash_Wednesday = new Date (  
    Easter_date.getFullYear(),  
    Easter_date.getMonth(),  
    (Easter_date.getDate()-46)  
)

这个解决方案在JavaScript中从特定日期减去X天来找到日期似乎不再起作用了。


但是减去46天会使月份不同。因此,我不应该为新日期指定月份。 - user823527
不知道你最终想要实现什么,但是这个解决方案将按照其语法工作:从复活节减去46天。如果你不想减去46天,可以加上自己的数字(同样适用于月份) :) - pong
2
您链接的解决方案(“通过减去...找到日期”)仍然有效。 user823527的原始代码返回不正确的月份,因为它在减去46天之前减去了一个月。 setDate()只是按照广告宣传的方式工作。 - Daniel F. Thornton
3
已回滚您的编辑。您应该将那些信息作为评论添加进去。 - Christoffer Lette
谢谢。在Mac Safari上,setDate(-1)在某个特定月份(可能与夏令时有关的Heisenbug)失败了,setDate(y,m,-1)解决了这个问题。 - robocat
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接