我知道如何获得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
我错过了什么?有没有更好的办法?
答案 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();
}