如何将月份值从一个 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 会起作用,但我想知道是否有更简单、更清洁的方法。
【问题讨论】:
从您的描述看来,您真正想要的是让b
与a
具有相同的日期值。如果您也可以复制“一天中的时间”(小时、分钟、秒、毫秒),您可以简单地使用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 对象复制到另一个对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章