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

Posted

技术标签:

【中文标题】如何将月份值从一个 Date 对象复制到另一个对象? [复制]【英文标题】:How to copy the month value from one Date object to another? [duplicate] 【发布时间】:2020-01-02 20:47:21 【问题描述】:

给定两个 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 / typescript中将月份从一个日期对象复制到另一个对象的正确方法是什么?我想将两个日期都转换为字符串,复制正确的字符并将字符串解析回 Date 会起作用,但我想知道是否有更简单、更清洁的方法。

【问题讨论】:

从您的描述看来,您真正想要的是让ba 具有相同的日期值。如果您也可以复制“一天中的时间”(小时、分钟、秒、毫秒),您可以简单地使用a.setTime(b.getTime());。这将有效地将确切的时间戳从一个日期对象“克隆”到另一个日期对象。当你直接构造“a”时,你甚至可以这样做。 const a = new Date(b.getTime());。 Docs for setTime() here. 此外,JavaScript Date 通常被认为令人沮丧。根据您对日期对象的实际使用量,可能值得使用库来帮助使其更简单。我建议查看luxon。在 JavaScript 中处理日期时,它使许多事情变得更简单。 【参考方案1】:

问题在于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 个月)。

【讨论】:

【参考方案2】:

这是因为今天是您的幸运(或不幸!)日。这是您正在使用的特定日期。

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

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

【讨论】:

【参考方案3】:

这是每个月的天数的问题。

当你这样做时:

b.setMonth(a.getMonth());

您正在获取 b 日期,但月份为 2 月:Thu Feb 29 2019 16:11:03 GMT+0200

而 2019 年 2 月没有 29 天。所以日期实际上是3月1日:Thu Mar 01 2019 16:11:03 GMT+0200

这就是您在第二组控制台日志中获得第 2 个月的原因。

最后你设置的是 b.month 而不是 a.month 所以它从 a 日期中减去一个月(从 2 月到 1 月)。

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

在设置月份时,您还需要指定可以使用此代码的日期

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

【讨论】:

以上是关于如何将月份值从一个 Date 对象复制到另一个对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity 中,如何将值从一个脚本传递到另一个脚本?

如何将值从一个php页面传递到另一个? [复制]

如何将值从一个活动中的片段传递到另一个活动? [复制]

通过使用 java 脚本,我如何将值从一个 html 页面传递到另一个 html 页面? [复制]

将打字稿类转换为对象

在同一个表中将值从一列复制到另一列