如何从一个日期对象中复制月份值到另一个日期对象?

9
给定两个日期对象,如何将第一个对象的月份正确设置为另一个对象的月份?
我面临的任务是从一个日期对象复制天、月和年到另一个对象。复制天和年正常工作,问题出现在我尝试复制月份时。
使用b.setMonth(a.getMonth())会导致b的月份多1。
然而,使用b.setMonth(a.getMonth() - 1)会导致b的月份比要求的少1。
以下是typescript代码:
      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 ?

表面上看来 (a.getMonth() - 1) 应该会给出1,但是显然Date对象的行为与此不同。在javascript/typescript中,从一个Date对象复制月份的正确方式是什么?我想将两个日期都转换为字符串,复制正确的字符,并将字符串解析回Date对象,这样可以工作,但我想知道是否有更简单、更清晰的方法。


根据您的描述,似乎您真正想要的是使b具有与a相同的日期值。如果您也可以复制“时间”(小时、分钟、秒、毫秒),那么您可以简单地使用a.setTime(b.getTime());。这将有效地将一个日期对象的完整时间戳克隆到另一个日期对象中。您甚至可以在直接构造“a”时执行此操作。const a = new Date(b.getTime());此处为setTime()文档。 - Caleb
此外,JavaScript 的 Date 对象通常被认为是令人沮丧的。根据你实际处理日期对象的程度,使用一个库来简化它可能是值得的。我建议看看 luxon。在 JavaScript 中处理日期时,它可以让很多事情变得更加简单。 - Caleb
5个回答

9
问题在于`setMonth()`方法有一个可选的第二个参数,即日(文档)。如果不为日期提供值,则会自动使用日期中的日。
所以,如果您的A日期是2018年2月12日,而B日期是2019年8月29日,则通过执行`b.setMonth(a.getMonth())`,您隐含地设置了`b.setMonth(1,29)` (1 是 `a.getMonth()`,而 29 是 b 日期的日)。
这样,您就试图将日期设为2019年2月29日,这在2019年是不可能的,它将把月份加1,变成三月(第2月)。
如果您执行`b.setMonth(a.getMonth()-1)`,则将其设置为1月29日,这是可能的,因此您会得到一月作为月份(第1月)。

7

今天是你幸运(或不幸)的一天。这是你所操作的特定日期。

今年2月份只有28天。当你将“2019年8月29日”的月份设置为2月时,你试图创建无效日期“2019年2月29日”。它会被四舍五入到“2019年3月1日”。

如果昨天你尝试了这个实验,你就不会遇到这个问题。


2
这是一个与每月天数有关的问题。 当您执行以下操作时:
b.setMonth(a.getMonth());

你得到的是b日期,但是月份是二月:Thu Feb 29 2019 16:11:03 GMT+0200。
2019年二月只有28天,因此该日期实际上是3月1日:Thu Mar 01 2019 16:11:03 GMT+0200。
这就是为什么你在第二组控制台日志中得到了2月份。
最后,你设置的是b.month而不是a.month,因此它从a日期减去一个月(从2月到1月)。

0

因为您使用了 a.getMonth() 而不是 b.getMonth()。 所以您的主要月份是1而不是2。


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


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