如何将月份值从一个Date对象复制到另一个?

时间:2019-08-29 14:34:10

标签: javascript angular typescript ionic-framework

给定两个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都可以,但是我想知道是否有一种更简单,更干净的方法。

5 个答案:

答案 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());