向前或向后计算一周中的某一天的最简单方法是什么?



如果我想计算将来一周中的某一天,结果非常简单:

enum { SUNDAY = 0, MONDAY = 1/*....*/ SATURDAY = 6}
int getDayInFuture(int currentDay, int numDaysForward)
{
return (currentDay + numDaysForward) % 7; 
}
But I have a function where you can enter a number of days either forward or backward, and I'm having trouble for when calculating a day in the past. The best I've done so far is:

inline int getDayInFutureOrPast(int currentDay, int numDaysForwardOrBack)
{
int result = (currentDay + numDaysForwardOrBack);
if (result >= 0) return result % 7; // JUST CALCULATE IT SIMPLY AS NORMAL
else // GOING BACKWARDS
{
int remainder = result % 7;
if (remainder == 0) return 0; // I HAVE TO ADD THIS SPECIAL CONDITION, IF I DON'T SUNDAY 
// (enum 0) minus 7 days ends up as -7 + (-7 modulo 7) == 7 
// SHOULD BE 0, SUNDAY(0) MINUS 7 DAYS SHOULD BE SUNDAY(0)
else return 7 + remainder;
}
}

我觉得有一种更简单的方法可以做到这一点,但我想不起来。

对当前日和 numDaysForwardOrBack 求和将给出所需的日期,但它不在 0 到 6 范围内。对总和使用模将得到 Sum/7 商的余数,但第一次模运算仍然可能给我们一个负结果。为了消除负面结果,我在结果中添加 7 并再次执行取模。此二次加法运算不会更改开始时为正的结果,因为模数会去除多余的部分,并且负值会向上移动到正范围。

inline int getDayInFutureOrPast(int currentDay, int numDaysForwardOrBack)
{
int remainder = (currentDay + numDaysForwardOrBack) % 7; // value range is [-6 to 6]
return (7 + remainder) % 7; //shifts value up to bring value range to [0 to 6]
}

最新更新