【问题标题】:Discrepancy between date-fns startOfWeek and format Wdate-fns startOfWeek 和格式 W 之间的差异
【发布时间】:2019-08-10 00:07:50
【问题描述】:

我对@9​​87654321@ 及其处理“周开始”的方式有疑问。

根据我的日历,2015 年 1 月 1 日的“一周开始”是 2014 年 12 月 29 日。

但是,date-fns#startOfWeek 告诉我不然:

❯❯❯ dateFns.startOfWeek(new Date('2015-01-01'))
Sun Dec 28 2014 00:00:00 GMT+0100 (Central European Standard Time)

如果我将startOfWeek (2014-12-28) 的结果格式化为只返回周数,我得到的是“52”(与dateFns#startOfWeek 提供的结果不匹配):

❯❯❯ dateFns.format(new Date('2014-12-28'), 'W')
"52"

但是,如果我格式化原始日期(2015-01-01),它将返回“1”:

❯❯❯ dateFns.format(new Date('2015-01-01'), 'W')
"1"

为什么会出现这种差异?获得正确的“一周开始”日期和周数的正确方法是什么?

注意,当我在 Node.js CLI 上运行上述命令时,我在环境变量中设置了 TZ=Etc/UTC。所以应该不是时区问题。

【问题讨论】:

  • 我个人觉得moment.js 对开发者更友好
  • @carkod 我正在从 Moment.js 迁移到 date-fns,我需要减小包的大小。
  • 一周的第一天是行政事务。有的地方是星期天,有的地方是星期一,有的地方是星期六。可能还有其他人。

标签: javascript date date-fns


【解决方案1】:

你得到的是正确的。默认情况下,一周从星期日开始。但是如果你想从星期一开始,你可以这样做:

var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1})

Reference

例子:

var result = dateFns.startOfWeek(new Date('2015-01-01'))
console.log(result);

result = dateFns.startOfWeek(new Date('2015-01-01'), {weekStartsOn: 1})
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min.js"></script>

关于周数,format() 中的 W 为您提供 ISO 周数,这意味着它从星期一开始。而且2014年只有52周。

来源:https://www.epochconverter.com/weeks/2014

【讨论】:

  • 感谢您的回答,这并不能解释 startOfWeekformat(x, 'W') 之间的差异,您能帮我解决这个问题吗?
  • 即使这样也是正确的。 W in format() 为您提供 ISO 周数,这意味着它从星期一开始。而且2014年只有52周。来源:epochconverter.com/weeks/2014
  • 哦,我明白了,谢谢,这令人困惑 ? 您能否更新您的答案以包含此信息?
  • 当然。乐于助人:)
【解决方案2】:

我不知道它是什么时候添加的,但您也可以在 2021 年使用 startOfISOWeek 代替 startOfWeek 代替 date-fns

startOfISOWeek 返回日期 Monday 而不是 Sunday 作为一周的开始。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2021-01-07
    • 2021-08-03
    • 2020-07-25
    • 2018-09-09
    相关资源
    最近更新 更多