什么是实现这个Javascript循环的正确方法?

问题描述:

我正在使用PHP来获取我的日期从服务器和Javascript来做前端数学的日历。在服务器上,我使用以下值来处理:今天的日期,当月的天数以及当周的位置,并参考Sun to Sat 0-6约定。为了找到特定月份的第一天,我必须从当前具有已知价值的那一天开始向后工作。什么是实现这个Javascript循环的正确方法?

下面的图表显示了我想用Javascript做什么。当我将pos变量重新设置为6(因为for循环问题)时,我打开0,因为我正在减去pos。

enter image description here

的问题是,当for循环开始,今天的当前日期是5的位置立即被1,减去当它不应该直到第二天是28(上)。

通过插入延迟(请参阅initialPos变量),我可以获得正确的值。这看起来不正确,那么做到这一点的正确方法是什么?

下面是带有和没有延迟的输出的比较。

随着延迟:

enter image description here

没有延迟: (无延迟装置没加1 todayPositionWeek和7为6用于复位计数器POS)

enter image description here

<script> 
    today = 29; 
    todayPositionWeek = 5; 

    // start the count with todayPositionWeek shifted by 1 to not count 
    var initialPos = todayPositionWeek+1; 
    var numSwitches = 0; 
    var loopRan = 0; 
    for (var i = today; i > 0; i--) { 
     loopRan++; 
     // initialPos is 6 
     initialPos--; 
     // after it is 5 on first run 
     if(initialPos == 0) { 
      // reset pos counter 
      initialPos = 7; 
      // initially this was set to 6 but skips to 5 
      numSwitches++; 
     } 

    firstDayPos = initialPos; 

    } 
    alert('loop ended ' + firstDayPos + ' ' + numSwitches + ' ' + loopRan); 
</script> 

今天很好,但如果一天休息(今天不是星期五)是关闭...

enter image description here

+1

不完全知道你正试图在这里做。你不能使用JavaScript的内置Date类。这有点基本/令人讨厌使用,但它可能在这里用于你的目的。或者,也许你可以使用某种类型的整数算术(国防部,地板等)? –

+0

@ dan-man,我已经展示了我想要做的事情,图表就是我想要完成的。 PHP给了我一些基于今天日期的已知值。我正在确定填写日历的值。问题在于循环并不直接,因为for循环的运行方式,我必须通过添加“延迟”来编辑它。这个工作现在正常,工作,我说它很糟糕,这是不对的。这是一个“黑客”或一块废话。这是一个完整的日历,不仅仅是今天的日期。 – janicehoplin

+1

我还没有真正明白,但是你不是在做'(a-b)%7'吗? –

var today = 27; 
var todayPositionWeek=3; 

var offset = (toDayPositionWeek+7-(today%7))%7 // ==4 because day0 ==4 

function posOfAnyDay(d) { 
    return (offset + d) % 7; 
} 
function slotOfAnyDay(d) { 
    return Math.floor((offset + d)/7); 
} 

// posOfAnyDay(13) -> 3 
// slotOfAnyDay(13) -> 2 

for (var i = today; i > 0; i--) { 
    pos = posOfAnyDay(i); 
    slot = slotOfAnyDay(i); 
} 
+0

我现在很迷茫,只是想了解我自己的代码,我甚至不知道你的代码。没有冒犯的意思,我只是说我无法遵循,甚至不知道我在问什么,但感谢你的答案。 – janicehoplin