【问题标题】:Moment Js Issue : isoWeekYear & isoWeek method behaviorMoment Js 问题:isoWeekYear 和 isoWeek 方法行为
【发布时间】:2016-01-18 19:48:18
【问题描述】:
  1. 我使用 moment 的 isoWeek 函数从某个日期获取 iso 周。

    moment(new Date(2015,11,28)).isoWeek() //输出53

  2. 我使用 moment 的 isoWeekYear 函数从同一日期获取 iso 周年。

    moment(new Date(2015,11,28)).isoWeekYear() //输出2015

  3. 但是当我给矩函数的输入提供相同的输出时,它会产生不同的日期。

    moment().isoWeek(53).isoWeekYear(2015).isoWeekday(0).toDate() //输出 2014 年 12 月 28 日

对于其他日期,它工作正常。我的代码中是否缺少任何内容,或者是 Moment 的错误?

这是一个演示JSFiddleconsole.log("Iso Week :",moment(new Date(2015,11,28)).isoWeek()); console.log("Iso Year :",moment(new Date(2015,11,28)).isoWeekYear()); console.log("Date :", moment().isoWeek(53).isoWeekYear(2015).isoWeekday(0).toDate());

【问题讨论】:

  • 原生日期对时刻一无所知
  • 你为什么要把时刻传递给原生日期?
  • 嗨,sunder,我添加这个只是为了将时间戳的响应转换为日期格式。
  • 感谢您的快速回复
  • 为了做到这一点做这个moment().isoWeek(53).isoWeekYear(2015).isoWeekday(1).toDate();

标签: javascript momentjs


【解决方案1】:

这可能是您对细分的顺序。 这有效:

moment().isoWeekYear(2015).isoWeekday(1).isoWeek(53).toDate());

从 Moment.js 文档中查看。

如果您链接多个操作来构建日期,您应该开始 从一年,然后是一个月,然后是一天等。否则你可能会得到 意想不到的结果,比如当 day=31 而当月只有 30 天(同样适用于原生 JavaScript 日期操作), 返回日期将是下个月的 1 日。

isoWeekDays 也从 1 变为 7。通过设置 0,您将获得下周的星期一。

【讨论】:

    【解决方案2】:

    首先您必须了解一件事。在您的第一次操作中,这里发生的事情是,

    moment(new Date(2015,11,28)).isoWeek() //output 53
    

    使用 new Date() 创建日期时,您已将 11 作为月份传递。所以在创建日期时月份会增加 1。因此日期将为 2015-12-28。因此周数为 53 .

    所以对于第三次操作,您传递了相同的结果。所以时刻返回了正确的日期。

    在你的情况下,如果你想在第一次操作中将月份减去 1。

    moment(new Date(2015,10,28)).isoWeek();
    

    现在你会得到正确答案

    【讨论】:

    • 我的意思是......它不适用于 2015 年 12 月 28 日的日期。它返回 2014 年的日期,而不是返回 2015 年 12 月 28 日的日期(这是 2015 年第 53 弱的第一天) .
    • @Scorpio Co. github.com/moment/moment/issues/2033 这似乎是一个错误
    猜你喜欢
    • 2016-05-27
    • 2021-12-14
    • 1970-01-01
    • 2022-10-01
    • 2017-07-07
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多