我正在使用PHP编写日历,从服务器获取日期,使用Javascript进行前端数学运算。从服务器我使用以下值来处理:今天的日期,当前月份的天数,以及本周的位置,参考太阳到周六0-6大会。为了找到某个月的第一天,我必须从当前具有已知价值的日子开始倒退。
下面的图表显示了我正在尝试使用Javascript。一个开关就是我将pos变量改回到6(由于for循环问题而导致7),因为当我从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>
今天没事,但是如果这一天结束了(今天不是星期五),那么转移的日子已经过去了......
答案 0 :(得分:1)
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);
}