美国格式的周数

时间:2015-12-19 10:34:04

标签: javascript date

我知道如何获得ISO format的周数。有一些很好的问题和答案。

我现在想知道如何找到美国格式的周数。美国week number rules说第1周总是包含1月1日的一周,所以我在1月份保险。但是如何知道某一年3月1日的周数呢?

从某种程度上来说,我想它必须考虑到一年中哪一天开始,找出那些年的长度和迭代,直到我到达正确的一天,增加几周。

在我的逻辑中应该是这样的:

function getUSweekNumber(y, m, d) {
    var firstOfJanuary = new Date(y, 0, 1);
    var dayOfWeek = firstOfJanuary.getDay() || 7;
    var weekNr = 1;
    for (var i = 0; i < m; i++) {
        var daysInMonth = new Date(y, i + 1, 0).getDate();
        weekNr += parseInt(daysInMonth / 7, 10);
        dayOfWeek += daysInMonth % 7;
    }
    weekNr += parseInt((dayOfWeek + d) / 7, 10);
    return weekNr;
}

但我的结果错了:

console.log(getUSweekNumber(2015, 0, 1)); // 1
console.log(getUSweekNumber(2015, 0, 15)); // 3
console.log(getUSweekNumber(2015, 7, 1)); // 32 <- wrong, whould be 31 

我错过了什么?有没有更好的办法?

jsFiddle:https://jsfiddle.net/Lqghrvw0/2/

3 个答案:

答案 0 :(得分:1)

你的循环方法似乎有点复杂。你最初的想法是你需要一周中哪一天很好,但你没有正确使用它。

美国周从周日开始,第一周是1月1日那周。让我们仔细看看2015年的第一周:

while True:
       for event in pregame.event.get():
               if event.type == pregame.QUIT:
                        pregame.quit()
         window.fill((0,0,0))
         #####Render here
         pygame.display.flip()
         pygame.time.Clock().tick(30)

为了便于计算,我们希望改变一周,因此前7天是第1周。我们如何做到这一点?好吧,通过使用星期几。因为星期日已经是第0天,所以我们不需要以任何方式改变它。如果1月1日是星期天,我们不需要改变一周。

我们可以轻松计算两个日期之间的天数。由于夏令时,我们必须舍入我们得到的数字,并且因为我们不会将时钟转换超过12小时,所以我们很好地正常化了这种方式。然后我们只需要将数字除以7即可获得周数。

| 28 | 29 | 30 | 31 | 1  | 2  | 3  |
| Su | Mo | Tu | We | Th | Fr | Sa |

答案 1 :(得分:1)

一线解决方案

看来所选答案可能有错误。例如,当给定日期为30-DEC-2015时,它应返回1,因为该周包含1-JAN-2016。然而,函数返回53.

问题是如何处理今年第一周内的前一年的最后几天?

处理它的一种可能方法是调整目标日期,使其始终在一周的最后一天而不是一周中的任何一天开始。这可以通过使用日期值(0-6)作为偏移来完成,如下所示:

 var endDate = targetDate.getUTCDate() + 6 - targetDate.getUTCDay();

这适用于美国week numbering,也可以使用ISO-8601周编号进行微小修改(未显示)。然后我们可以将这个片段插入一个单行解决方案中,如下所示:

var weeks=Math.ceil((((d.setUTCDate(d.getUTCDate()+6-d.getUTCDay())-d.setUTCMonth(0,1))/86400000)+d.getUTCDay()+1)/7);

我们的功能就变成了:

function getWeekUS( date ) {    
   var d = new Date( date ); 
   return Math.ceil(((( d.setUTCDate( d.getUTCDate() + 6 - d.getUTCDay()) - d.setUTCMonth( 0, 1 )) / 86400000 ) + d.getUTCDay() + 1 ) / 7 );
 }

说明:

我们首先复制日期以避免更改原件。然后我们添加一个偏移量,使目标日期落在一周的最后一天。然后我们将日期设置为1-JAN并找出它与目标日期之间的差异。我们将该数字除以8640000(24 * 60 * 60 * 1000)以将毫秒转换为天。最后,我们添加起始日期偏移,然后除以7得到几周。

现在我们的函数为30-DEC-2015等边缘情况返回正确的周。

答案 2 :(得分:0)

使用http://momentjs.com。他们定义方法week

function getUSweekNumber(y, m, d) {
  var date = moment({ year: y, month: m, day: d });
  return date.week();
}