【问题标题】:How to reliably get previous month from js Date?如何可靠地从 js Date 获取上个月?
【发布时间】:2023-04-05 07:34:01
【问题描述】:

用香草javascript从给定日期获取上个月的更好方法是什么?

快速搜索会告诉您:

const getPreviousMonth = date => {
  const clone = new Date(date.getTime())
  clone.setMonth(date.getMonth() - 1)
  return clone
}

getPreviousDate(new Date(2021, 4, 31)) 的问题返回 5 月 1 日,而不是 4 月 30 日,这似乎意味着它只是减去了 30 天。奇怪的是,getPreviousDate(new Date(2021, 2, 1)) 正确地返回了 2 月 1 日而不是 1 月的较晚日期,所以 30 天的理论是无效的。

鉴于此,是否有最佳实践香草解决方案来获取上个月?目前,我添加了如下一行:if (date.getDate() === 31) newDate.setDate(-1),它返回 4 月 29 日(!?)。所以我确信存在更好的解决方案。

PS.:为了清楚起见,我不想知道 30 天前是哪一天,而是上个月是哪一个月。所以到 5 月 31 日答案是 4 月,到 3 月 1 日是 2 月。

编辑:具体来说,我想返回上个月内的 Date 对象,最好是最后一天。

【问题讨论】:

  • Moment 有(有?)方法,如moment(date).subtract(30, "days")moment(date).subtract(1, "month")。不确定 Moment 的继任者 Luxon 的语法是什么
  • 上个月只是clone.getMonth(),即4
  • 不是“减去 30 天”那么简单。当月份中的某天超出范围时,它将增加或减少差异。例如 new Date(2021, 2, 0) 返回 2 月的最后一天
  • 你到底需要什么结果?
  • 上个月的日期对象,最好是上个月的最后一天。我通过添加 if 语句得到了这一点,但是这样的解决方案让我怀疑我错过了一些东西。 getMonth 行为对我来说看起来不可靠。

标签: javascript date


【解决方案1】:

只需使用clone.setDate(0),您将获得上个月的最后一天

const dates = [new Date(2021,0,15), new Date(2021,2,31)]

const getPreviousMonth = date => {
  const clone = new Date(date)
  clone.setDate(0)
  return clone
}

dates.forEach(d=>{
  console.log(getPreviousMonth(d))
})

【讨论】:

  • 所以设置 0 而不是 -1 肯定会修复到 4 月 29 日。它有效,但仍然需要 if (date.getDate() === 31) newDate.setDate(0)。我当然会很高兴取消它。
  • 如果您总是想要上个月的最后一天,则不需要 if()
  • 对不起,我的错,如果函数只获取上个月,则不需要。这就是例子,所以你是对的。如果函数给了我们 -X 月,那么我似乎无法取消它。抱歉纠正我。
【解决方案2】:

这就是你要找的东西:

now = new Date();
if (now.getMonth() == 0) {
   var  current = new Date(now.getFullYear() - 1, 11, 1);
} else {
    var current = new Date(now.getFullYear(), now.getMonth());
}
console.log(current);

【讨论】:

  • 这将在 1 月之前的一个月返回 undefined,这当然可以修复。但是让输出成为一个日期要方便得多。我可以很容易地得到年份和 localeStrings。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多