2016-08-10 5 views
2

私は指定された月数だけ日付をシフトしようとしていますが、同じ日を保つようにしています(例えば、日付の日付が月曜日で、 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 = 2016年8月1日(月曜日)と期間は5ヶ月を追加した後5 だろう、私は日曜日である2017年1月1日、最も近い月曜日が上になり得ます02.01.2017、しかし、私は6日かかる。

+1

どのような状況で失敗するのですか? – ChrisF

+0

使用:新しいDateTime(startDayOfWeek.Year、startDayOfWeek.month + 1、startDayOfWeek.day)。 – jdweng

+0

たとえば、1月31日を1か月でシフトするとどうなりますか? – CompuChip

答えて

2

このコードを使用してください。考え方は、日数を7で割り、丸め、7を掛けることです。

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

整数を除算しながら丸めを行います。int result = 5/2; // 2'と 'int result = 3/2; // 1' – fubo

+0

いいえ、小数点以下切り捨て部分、丸められていません – Angel

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)); 
} 
関連する問題