给定两个Date对象,如何将第一个对象的月份正确设置为另一个对象的月份?
我面临着将日期,月份和年份从一个Date对象复制到另一个对象的任务。复制日期和年份按预期工作,当我尝试复制月份时出现问题。
使用b.setMonth(a.getMonth())
会导致b的月份过多。
但是,使用b.setMonth(a.getMonth() - 1)
会导致b的月份比要求的少一。
以下打字稿代码:
let a = new Date(2018, 1, 12);
let b = new Date();
console.log(a);
console.log(b);
console.log('====');
console.log(a.getMonth());
console.log(b.getMonth());
b.setMonth(a.getMonth());
console.log('====');
console.log(a.getMonth());
console.log(b.getMonth());
b.setMonth(a.getMonth() - 1);
console.log('====');
console.log(a.getMonth());
console.log(b.getMonth());
返回:
Mon Feb 12 2018 00:00:00 GMT+0100
Thu Aug 29 2019 16:11:03 GMT+0200
====
1
7
====
1
2
====
1
0 // 2 - 1 = 0 ?
貌似2-1应该给1 (a.getMonth() - 1)
,但是显然Date对象的行为有所不同。将javascript中的月份从一个Date对象复制到另一个Date对象的正确方法是什么?我想将两个日期都转换为字符串,复制正确的字符,然后将字符串解析回Date都可以,但是我想知道是否有一种更简单,更干净的方法。
答案 0 :(得分:9)
问题是setMonth()
方法有一个可选的第二个参数,即天(DOCS)。如果您没有提供当天的值,它将自动使用日期之一。
所以,您的A日期是2018年2月12日,而您的B日期是2019年8月29日。
通过b.setMonth(a.getMonth());
,您隐式地说b.setMonth(1,29);
(1是a.getMonth(),而29是b日期的一天)。
因此,您尝试将日期设置为2月29日,这在2019年是不可能的,并且会将月份从1转移到3月(第2个月)。
如果您执行b.setMonth(a.getMonth() -1);
,则将其设置为1月29日,这有可能,因此您将1月作为月份(第1个月)。
答案 1 :(得分:7)
这是因为这是您幸运的一天。这是您正在工作的特定日期。
今年2月只有28天。当您将“ Aug 29 2019”月份设置为二月时,您正在尝试创建无效的日期“ Feb 29 2019”。舍入到“ 2019年3月1日”。
如果您昨天尝试过该实验,就不会发现此问题。
答案 2 :(得分:2)
这是每个月的天数问题。
当您这样做:
b.setMonth(a.getMonth());
您将获得b日期,但以2月为月份:2019年2月29日,星期四GMT + 0200
2019年2月没有29天。所以日期实际上是3月1日:2019年3月1日星期四16:11:03 GMT + 0200
这就是为什么您在第二组控制台日志中获得第二个月的原因。
最后,您将b.month设置为a.month,因此它从日期(从2月到1月)中减去一个月。
答案 3 :(得分:0)
因为您使用a.getMonth()而不是b.getMonth()。 因此,您的主要月份是1,而不是2。
答案 4 :(得分:0)
设置月份时,您还需要指定可以使用此代码的日期
var a = new Date(2018, 1, 12);
var b = new Date();
console.log(a);
console.log(b);
console.log('====');
console.log(a.getMonth());
console.log(b.getMonth());
b.setMonth(a.getMonth(),1);
console.log('====');
console.log(a.getMonth());
console.log(b.getMonth());
b.setMonth(a.getMonth() - 1,1);
console.log('====');
console.log(a.getMonth());
console.log(b.getMonth());