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

Wer*_*rek 9 javascript typescript ionic-framework angular

给定两个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());
Run Code Online (Sandbox Code Playgroud)

返回值:

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 ?
Run Code Online (Sandbox Code Playgroud)

似乎2-1应该给1 (a.getMonth() - 1),但是显然Date对象的行为有所不同。在javascript / typescript中将月份从一个Date对象复制到另一个Date对象的正确方法是什么?我想将两个日期都转换为字符串,复制正确的字符,然后将字符串解析回Date可以,但是我想知道是否有一种更简单,更清洁的方法。

Luc*_*zzi 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月(第二个月)。

如果您b.setMonth(a.getMonth() -1);将其设置为1月29日,则可以将1月作为一个月(第1个月)。


ksh*_*ine 7

这是因为这是您幸运的一天。这是您正在工作的特定日期。

今年2月只有28天。当您将“ Aug 29 2019”月份设置为二月时,您正在尝试创建无效的日期“ Feb 29 2019”。舍入到“ 2019年3月1日”。

如果您昨天尝试过此实验,则不会看到此问题。