按月移动日期,但保持同一天

时间:2016-08-10 13:21:56

标签: c# algorithm date

我正在尝试将某个日期转移一定数月,但也要保持同一天(例如,如果日期的日期是星期一,并且在x个月后转移到星期四,我想要也可以从新获得的日期中减去3天。该算法应根据新获得的日期添加/减去天数,基本上提供代表同一天的最近日期。举个例子,如果我的开始日期是10.08.2016(星期三),我加3个月,我将在10.11.2016(星期四),所以最接近当天的星期三是09.11.2016。

到目前为止我设法做的事情看起来像这样:

int startDayOfWeek = ((int)startDay.DayOfWeek) == 0 ? 7 : (int)startDay.DayOfWeek;
int newStartDayOfWeek = ((int)startDay.AddMonths(period).DayOfWeek) == 0 ? 7 : (int)startDay.AddMonths(period).DayOfWeek;
int shiftingDays = startDayOfWeek - newStartDayOfWeek;

if (shiftingDays > 3)
    shiftingDays -= 7;

其中startDay是开始日期,句点是我想要转移到的月数。

但这仍然有些失败,所以任何提示都会受到高度赞赏。

此代码失败的示例是: startDate = 01.08.2016(星期一),期间为5 在加入5个月之后,我得到01.01.2017,这是星期日,最接近的星期一将是2017年1月2日,但我得到-6天。

2 个答案:

答案 0 :(得分:2)

使用此代码。我们的想法是将天数除以7,然后乘以7。

DateTime endDate = startDay.AddMonths((int)period);
endDate = startDay.AddDays((int)Math.Round((double)(endDate - startDay ).Days / 7)*7);

答案 1 :(得分:0)

这就是你要找的东西吗?

static void Main( string[] args )
{
    //DateTime startDay = DateTime.Now;
    DateTime startDay = new DateTime( 2016, 8, 1 );
    //DateTime startDay = new DateTime( 2016, 8, 10 );

    DateTime newDay = startDay.AddMonths( 5 );

    int startDayOfWeek = (int)startDay.DayOfWeek;
    int newDayOfWeek = (int)newDay.DayOfWeek;

    int shift1 = (7 + startDayOfWeek - newDayOfWeek) % 7;
    int shift2 = (7 + newDayOfWeek - startDayOfWeek) % 7;

    DateTime test = newDay + ((shift1 > shift2) ? - TimeSpan.FromDays( shift2 ) : TimeSpan.FromDays( shift1 ));
}