Moment: “week()”函数返回了错误的周数

创建于 2018-07-19  ·  5评论  ·  资料来源: moment/moment

问题描述和重现步骤:
创建日期时,例如[2018, 11, 29] ,并执行week函数,结果为52 ,但对于[2018, 11, 30]31它也返回1 。 预期结果是52

例子

const a = moment([2018, 11, 29]);
console.log('a', a.year(), a.week());
//a 2018 52

const b = moment([2018, 11, 30]);
console.log('b', b.year(), b.week());
//b 2018 1

jsbin 实例

环境:
Safari 11.1.2 on OSX

其他可能有用的信息:

"Thu Jul 19 2018 16:52:11 GMT+0200 (CEST)"
"7/19/2018, 4:52:11 PM"
-120
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"
"2.14.1"

最有用的评论

我认为您可能对周编号的工作方式与既定做法有所不同。

例如,您认为 1 月 1 日总是在第 1 周,而 12 月 31 日总是在第 52/53 周 - 公平地说,一些挂历确实显示这样的周编号。

在标准化周数时,首选是确保一周始终包含 7 天。 对于 ISO 标准:周从周一到周日,第 1 周包含一年中的第一个周四。 这意味着第 1 周的周一至周三 _可能_ 落在前一年。 (这将发生在 2019/2020 年:2019 年 12 月 29 日至 31 日被视为 2020 年第 1 周的一部分)

您没有使用 ISO 方法( isoWeek() / isoWeekYear() ),因此您依赖于您所在地区的一周定义,即从周日到周六运行。

2018 年 12 月 30 日是星期日,也是您所在地区一周的第一天。 该周只有 2 天是 2018 年,其余时间是 2019 年。您所在地区的规则用于决定该周(全部 7 天)是属于 2018 年第 53 周还是 2019 年第 1 周。就您而言,他们说 2019 年第 1 周。

所有5条评论

我们遇到同样的问题。
console.log(moment("2018-w15", "YYYY-[w]WW").add(38, "weeks").format("YYYY-[w]WW"))
显示2018-w01

@numen31337您可能想要使用weekYear()而不是year()

@Blapi WW是 ISO 周,因此您很可能需要在格式化时使用GGGG而不是YYYYGGGG是 ISO“周年” )

我将澄清一下,这是带有日期和相关输出的代码:

const a = moment([2018, 11, 29]);
console.log(
            `a year: ${a.year()}`,  //a year: 2018
            `a month: ${a.month()}`, //a month: 11
            `a date: ${a.date()}`, //a date: 29
            `a week: ${a.week()}`, //a week: 52
            `a weekYear: ${a.weekYear()}`, //a weekYear: 2018
);

const b = moment([2018, 11, 30]);
console.log(
            `b year: ${b.year()}`, //b year: 2018
            `b month: ${b.month()}`, //b month: 11
            `b date: ${b.date()}`, //b date: 30
            `b week: ${b.week()}`, //b week: 1 <=== Why 1?
            `b weekYear: ${b.weekYear()}`, //b weekYear: 2019 <=== Why 2019?
);

我的问题是week2018, 11, 30返回1而不是52 。 也许我误解了这个库的一些概念? 从长远来看,我的任务是计算两个日期之间的日历周数,我已使用以下解决方法完成此操作:

const fromDateStartWeek = fromDate.startOf('week');
const toDateStartWeek = toDate.startOf('week');
return toDateStartWeek.diff(fromDateStartWeek, 'weeks');

但我仍然对这个week函数感到困惑。 这是一个错误还是我错过了什么? 我来自本机开发,对 javascript 还很陌生。 谢谢你。

我认为您可能对周编号的工作方式与既定做法有所不同。

例如,您认为 1 月 1 日总是在第 1 周,而 12 月 31 日总是在第 52/53 周 - 公平地说,一些挂历确实显示这样的周编号。

在标准化周数时,首选是确保一周始终包含 7 天。 对于 ISO 标准:周从周一到周日,第 1 周包含一年中的第一个周四。 这意味着第 1 周的周一至周三 _可能_ 落在前一年。 (这将发生在 2019/2020 年:2019 年 12 月 29 日至 31 日被视为 2020 年第 1 周的一部分)

您没有使用 ISO 方法( isoWeek() / isoWeekYear() ),因此您依赖于您所在地区的一周定义,即从周日到周六运行。

2018 年 12 月 30 日是星期日,也是您所在地区一周的第一天。 该周只有 2 天是 2018 年,其余时间是 2019 年。您所在地区的规则用于决定该周(全部 7 天)是属于 2018 年第 53 周还是 2019 年第 1 周。就您而言,他们说 2019 年第 1 周。

谢谢你的澄清。 这对我来说真的很惊讶。 我真的很想念像 Apple Calendar dateComponents(_:from:to:)这样的 API,您可以在其中要求特定组件的差异,在我的情况下Calendar.current.dateComponents([.weekOfYear], from: sinceDay, to: targetDay)并在一年中的实际几周内收到差异,不只是days / 7

此页面是否有帮助?
0 / 5 - 0 等级