使用 moment.js 如何将 day(0) 设置为本周而不是上周的星期日

Using moment.js how do I set day(0) as Sunday this week instead of previous week

我正在使用 moment.js 并且正在执行以下操作:

moment().startOf('isoWeek').day(0)

不是给我这周的星期日 - 25 日,而是 returns 前一个星期日,18 日。

我在数据库中保存了从 0 到 6 的天数(1 = 星期一,0 = 星期日)

如何使用 0 获取周的星期日而不是前一个星期日?

编辑: 感谢所有回复。我想我现在只是将日期增加一周,但从长远来看,可能会转为在整个项目中使用 date-fns。谢谢

虽然 startOf('isoWeek') 使用星期一作为一周的第一天,但​​ .day(0) 使用 ECMAScript 定义并将您带回另一天(因为根据其定义,星期日 之前星期一属于相应的一周)。

要解决此问题并获得即将到来的星期日,请按照 https://momentjscom.readthedocs.io/en/latest/moment/03-manipulating/01-add/ 中所述使用 moment 的 add 函数再添加一周:

moment().startOf('isoWeek').day(0).add(1, 'weeks')

或按照 https://momentjscom.readthedocs.io/en/latest/moment/02-get-set/06-day/ 上的建议使用 shorthand:

moment().startOf('isoWeek').day(7); 

moment.js 周 从周日开始 并在周六结束。这是日历的常用格式(虽然不是我喜欢的格式)。

您可以通过将日期设置为 8 而不是 0 来使其环绕。


也就是说,Moment.js 的开发人员自己说“We now generally consider Moment to be a legacy project in maintenance mode.”并列出了您可能不想使用它的一些原因。

一种流行的替代方法是 date-fns,它允许您编写如下代码:

<script type=module>
import { nextSunday, formatISO, startOfWeek } from 'https://esm.run/date-fns';

const today = new Date();
const start = startOfWeek(today, { weekStartsOn: 1 }); // 1 is Monday
const sunday = nextSunday(today)
console.log(formatISO(sunday));
</script>

您可以在 0 之后添加 + 7 以获得“下一个”星期日。像这样:

const date = moment().startOf("isoWeek").day(0 + 7);
console.log("date", date);

在英语中,一周从星期日开始。这就是为什么您的代码会在“前一个”星期日发回给您。因为这周已经开始了。

但要小心,Moment.Js si 现在贬值了。我建议您为您的项目使用 date.fns。