Moment.js:获取给定年份的第一周的第一天

l2a*_*lba 3 javascript time date week-number momentjs

我试图在给定日期前获得第一周的第一天

正确结果:

2017 = 1 月 2 日(星期一)

2016 = 1 月 4 日(星期一)

2015 = 1 月 1 日(星期四)

2014 = 1 月 1 日(星期三)

2013 = 1 月 1 日(星期二)

我可以通过以下方式获得一年的第一天

moment().year(year).startOf('year') // All result is 1. jan XXXX
Run Code Online (Sandbox Code Playgroud)

然后我尝试了:(正确)

moment().day(1).year(2017).week(1) // 2 Jan (Monday) (correct)
Run Code Online (Sandbox Code Playgroud)

但是当改为2016时:(错误)

moment().day(1).year(2016).week(1) // 10 Jan (Sunday) (wrong)
Run Code Online (Sandbox Code Playgroud)

任何知道如何获得正确的结果?(我date()也对纯 JS 开放)

PS:周数基于挪威

游乐场: https : //jsfiddle.net/6sar​​7eb4/

Vin*_*zoC 6

无需使用循环,您可以简单地测试周数是否未1使用week()以提供本地化输出

的输出moment#week将取决于当时的语言环境。

您必须使用locale()方法将语言环境设置为 moment以了解一周的开始语言环境。如果您必须用英文显示结果,您可以在本地更改语言环境

这是一个工作示例:

function getFirstDayOfFirstWeekByYear( year ) {
  // Create moment object for the first day of the given year
  let func = moment({year:year})
  // Check if 1st of January is in the first week of the year
  if( func.week() !== 1 ){
    // If not, add a week to the first day of the current week
    func.startOf('week').add(1, 'week');
  }
  // Return result using english locale
  return func.locale('en').format('D. MMMM YYYY (dddd)')
}

// Set Norwegian Bokmål locale globally
moment.locale('nb');

// Tester
[2017, 2016, 2015, 2014, 2013].forEach(function ( year ) {
  let s = '<li>' + getFirstDayOfFirstWeekByYear( year ) + '</li>'
  document.getElementsByTagName('BODY')[0].innerHTML += s
})
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.min.js"></script>
Run Code Online (Sandbox Code Playgroud)