问题描述和重现步骤:
创建日期时,例如[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
环境:
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"
我们遇到同样的问题。
console.log(moment("2018-w15", "YYYY-[w]WW").add(38, "weeks").format("YYYY-[w]WW"))
显示2018-w01
@numen31337您可能想要使用weekYear()而不是year()
@Blapi WW
是 ISO 周,因此您很可能需要在格式化时使用GGGG
而不是YYYY
( GGGG
是 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?
);
我的问题是week
的2018, 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
。
最有用的评论
我认为您可能对周编号的工作方式与既定做法有所不同。
例如,您认为 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 周。