首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moment.js :每年第一周的第一天

Moment.js :每年第一周的第一天
EN

Stack Overflow用户
提问于 2017-06-30 12:52:06
回答 3查看 6.6K关注 0票数 3

我试着把第一周的第一天定为某一天

正确结果:

2017年1月2日(星期一) 2016年1月4日(星期一) 2015年1月1日(星期四) 2014年1月1日(星期三) 2013年1月1日(星期二)

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

代码语言:javascript
复制
moment().year(year).startOf('year') // All result is 1. jan XXXX

然后我试着: (正确)

代码语言:javascript
复制
moment().day(1).year(2017).week(1) // 2 Jan (Monday) (correct)

,但当改为2016年时: (错)

代码语言:javascript
复制
moment().day(1).year(2016).week(1) // 10 Jan (Sunday) (wrong)

知道怎么得到正确的结果吗?(我也向纯JS date()开放)

PS:Week number挪威为基础

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-30 13:38:59

不需要使用循环,只需使用提供本地化输出的1来测试周数是否为week()

moment#week的输出将取决于当时的区域设置。

您必须使用locale()方法将地区设置为“时刻”,以使周开始时知道区域设置。如果你必须用英语显示结果,你可以http://momentjs.com/docs/#/i18n/instance-locale/

这里有一个工作样本:

代码语言:javascript
复制
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
})
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.min.js"></script>

票数 6
EN

Stack Overflow用户

发布于 2017-06-30 13:12:56

不管怎么说,如果你很乐意在一个循环内做这件事,这是可行的。

代码语言:javascript
复制
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++;
  };
}

结果

代码语言:javascript
复制
2. January 2017 (Monday)
4. January 2016 (Monday)
1. January 2015 (Thursday)
1. January 2014 (Wednesday)
1. January 2013 (Tuesday)
票数 2
EN

Stack Overflow用户

发布于 2017-06-30 23:44:32

我试着把第一周的第一天定为某一天

使用moment.js根据ISO 8601计划获取一年中第一周的第一天,您只需使用国际标准化组织周星期一开始以来一年的第一周的第一天:

代码语言:javascript
复制
// 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'));
});
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

但是,您似乎不想使用ISO方案,因此,如果您只想在一年中的第一天不是星期六或周日(即忽略ISO 8601计划),您可以这样做(没有moment.js):

代码语言:javascript
复制
// 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日历,它与其他地方常用的格鲁吉亚日历不一致,也不是由语言定义的,而是由宗教定义的。

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

如果您决定支持不同的方案,最好采用标准方案(如ISO 8601),并让用户将其更改为他们喜欢的方案(我的计算机和日历应用程序中的preferences允许我这样做)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44846953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档