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

Moment.js : Get first day of first week by given year

我正在尝试在给定日期之前获取第一周的第一天

正确结果:

2017 = 2 Jan (Monday)

2016 = 4 Jan (Monday)

2015 = 1 Jan (Thursday)

2014 = 1 Jan (Wednesday)

2013 = 1 Jan (Tuesday)

我可以通过 :

一年的第一天
moment().year(year).startOf('year') // All result is 1. jan XXXX

然后我试了:(正确)

moment().day(1).year(2017).week(1) // 2 Jan (Monday) (correct)

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

moment().day(1).year(2016).week(1) // 10 Jan (Sunday) (wrong)

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

PS:周数基于Norway

游乐场: https://jsfiddle.net/6sar7eb4/

无论如何,如果您愿意在一个循环中执行此操作,则此方法有效

function getFirstDayOfFirstWeekByYear( year ){
  let D = 1;
  x = 0;
  while(x !== 1){
   x = moment(`${year}-01-${D}`).isoWeek();
   if(x === 1 ){
    return moment(`${year}-01-${D}`).format('D. MMMM YYYY (dddd)')
   }
   D++;
  };
}

结果

2. January 2017 (Monday)
4. January 2016 (Monday)
1. January 2015 (Thursday)
1. January 2014 (Wednesday)
1. January 2013 (Tuesday)

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

The output of moment#week will depend on the locale for that moment.

您必须使用 locale() method to get start of week locale aware. If you have to show result in english you can change locale locally.

将语言环境设置为 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
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.min.js"></script>

Im trying to get the first day of first week by given day

使用moment.js根据ISO 8601方案获取一年中第一周的第一天,您可以只使用一年中第一周的第一天,因为ISO周开始于星期一:

// Return a moment.js object for the first weekday of the first week
// of the year using ISO 8601 scheme
function firstDay(year) {
  return moment(year + '011', 'GGGGWWE');
}

// Examples
['2015', '2016', '2017', '2018', '2019', '2020']
.forEach(function(year) {
  console.log('ISO First day of ' + year + ': ' +
               firstDay(year).format('dddd D MMMM, YYYY'));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

但是你似乎不想使用 ISO 方案,所以如果你只想获得一年中不是星期六或星期日的第一天(即忽略 ISO 8601 方案),你可以这样做(没有 moment.js):

// Return Date for first day of year that is one of
// Monday to Friday
function firstDay(year) {
  var d = new Date(year, 0, 1);
  var day = d.getDay();
  d.setDate(d.getDate() + (day%6? 0 :  (++day%4)));
  return d;
}

// Examples
['2015', '2016', '2017', '2018', '2019', '2020']
.forEach(function(year) {
  console.log('First weekday of ' + year + ': ' + firstDay(year).toString());
});

讨论

一周的第一天和一年的第一天有很多不同的方案。一个常用的方案是ISO 8601,其中一周的第一天是星期一,一年的第一周是第一个星期四出现的那个(或者第一个包含一周至少4天的,是一样的结果)。

根据 ISO 8601 规则,2019 年第一周的第一天是 2018 年 12 月 31 日星期一。

如果您决定支持不同的计划(例如,在沙特阿拉伯,一周从周六开始到周五结束,周六至周三为工作日,而在美国,一周通常为周日至周六,周一至周五为工作日),那么你应该清楚地说明你支持哪种方案,而不是简单地假设一个基于用户选择的语言的方案。方案也可能基于其他文化因素,例如宗教,因此不一定基于区域或语言。

沙特阿拉伯的英国人应该使用哪种方案?不丹的伊斯兰教徒?在沙特,商业的官方语言是法语,但大多数国际讨论都使用英语,而国家语言是阿拉伯语。但他们使用 Hijri calendar,它与其他地方普遍使用的格鲁吉亚日历不一致,并且不是由语言定义,而是由宗教定义。

即使在同一个地方也可能存在差异,同一政府的部门选择不同的方案,因此即使是地区(在该术语的正确含义中)也不是使用哪种方案的明确指标。

如果您决定支持不同的方案,最好采用标准方案(如 ISO 8601)并让用户根据需要将其更改为他们喜欢的方案(首选项 在我的电脑和日历应用程序中允许我这样做)。