什么是实现这个Javascript循环的正确方法?
问题描述:
我正在使用PHP来获取我的日期从服务器和Javascript来做前端数学的日历。在服务器上,我使用以下值来处理:今天的日期,当月的天数以及当周的位置,并参考Sun to Sat 0-6约定。为了找到特定月份的第一天,我必须从当前具有已知价值的那一天开始向后工作。什么是实现这个Javascript循环的正确方法?
下面的图表显示了我想用Javascript做什么。当我将pos变量重新设置为6(因为for循环问题)时,我打开0,因为我正在减去pos。
的问题是,当for循环开始,今天的当前日期是5的位置立即被1,减去当它不应该直到第二天是28(上)。
通过插入延迟(请参阅initialPos变量),我可以获得正确的值。这看起来不正确,那么做到这一点的正确方法是什么?
下面是带有和没有延迟的输出的比较。
随着延迟:
没有延迟: (无延迟装置没加1 todayPositionWeek和7为6用于复位计数器POS)
<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>
今天很好,但如果一天休息(今天不是星期五)是关闭...
答
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
不完全知道你正试图在这里做。你不能使用JavaScript的内置Date类。这有点基本/令人讨厌使用,但它可能在这里用于你的目的。或者,也许你可以使用某种类型的整数算术(国防部,地板等)? –
@ dan-man,我已经展示了我想要做的事情,图表就是我想要完成的。 PHP给了我一些基于今天日期的已知值。我正在确定填写日历的值。问题在于循环并不直接,因为for循环的运行方式,我必须通过添加“延迟”来编辑它。这个工作现在正常,工作,我说它很糟糕,这是不对的。这是一个“黑客”或一块废话。这是一个完整的日历,不仅仅是今天的日期。 – janicehoplin
我还没有真正明白,但是你不是在做'(a-b)%7'吗? –