2012-01-22 2 views
0

Я работал над проектом, в котором дата рассчитывается на основе количества дней, добавленных в текущую DateTime.Now. Я использую несколько функций, основанных на этой работе: business dates calculation, и так как для этого требуется расчет рабочих дней (выходные дни или праздники не рассчитаны, праздники кодируются в файл конфигурации приложения), счет должен начинаться с текущей даты «сейчас» или в предыдущий рабочий день, если старт находится в выходной день или в выходной день. Файл current всегда перемещает вперед на следующий рабочий день перед началом подсчета. Если дата начала сегодня, счет начнется завтра.день минус один метод для расчета рабочего дня C#

Мои требования, например: начальный день 1/21/2012 - суббота. Добавляется значение 10 дней. Итоговая дата должно быть 2 февраля. Это значит, что рабочий день для начала расчета - пятница 20 января + 9 дней = 10 дней. Другим примером могло бы стать начало в воскресенье 22 января, переход к 20 января и добавление 9 дней с тем же результатом. При условии, что счет не начинается по выходным или праздничным дням, он должен пропустить их и прийти к следующему расчетному рабочему дню.

Проблема, с которой я сталкиваюсь, заключается в том, что мой проект должен рассчитать на основе текущей даты или вернуться к предыдущему рабочему дню, если начало отсчета - выходные или праздничные дни.

Я думаю, что файл класса очень ясен, но я не могу найти способ заставить подсчет начать в текущий рабочий день или сделать шаг назад к предыдущему рабочему дню, если начало отсчета - выходные или праздничные дни ,

Пожалуйста, взгляните на код в ссылке. Я попытался добавить отрицательные значения в параметр addDays в нескольких существующих методах; в моей форме я попытался заставить значение dateTimePicker вычесть день и множество других трюков в течение всего файла класса, что приводит к сбою.

Любые советы или помощь были бы очень признательны!

код в случае нажатия кнопки:

//DateTime.Today.AddDays(-4); 

     DateTime date = dateTimePicker1.Value; 
     // dateTimePicker1.Value.AddDays(-2); 
     XDateTime sDate = new XDateTime(dateTimePicker1.Value.ToShortDateString(), XDateTimeType.Business); 

     string Str = textBox2.Text.Trim(); 
     string Str2 = textBox3.Text.Trim(); 

     double Num; 
     bool isNum = double.TryParse(Str, out Num); 
     bool isNum2 = double.TryParse(Str2, out Num); 
     label6.Text = ""; 

     //Test whether textBox contains a number or some other character. Fails if not a number. 
     if (isNum) 
     { 
      short days = Convert.ToInt16(textBox2.Text); 
      sDate.AddBusinessDays(days); 

      lblTodaysDate.Text = " Substantial Completion Date: " + sDate.Date.ToString("MMMM d, yyyy"); 
      label3.Text = ""; 

      if (isNum2) 
      { 
       short days2 = Convert.ToInt16(textBox3.Text); 
       sDate.AddBusinessDays(days2); 
       label6.Text = " Physical Completion Date: " + sDate.Date.ToString("MMMM d, yyyy"); 
       label5.Text = ""; 
      } 
      else 
       label5.Text = "Please enter numbers only!";    
      return; 
     } 
     else 
      label3.Text = "Please enter numbers only!"; 
     return; 
+0

0 Вы знаете, что произошло с этим вопросом? У меня была аналогичная проблема, но я решил создать функцию под названием «AddWorkDays» (byVal days как Integer, byVal Holidays as List (DateTime)). Таким образом, я могу передать праздники, которые я хочу пропустить для этой функции. Это похоже на то, как вы настроены, каждый 'XDateTime' сохраняет свои собственные праздники. – Origin

+0

Пожалуйста, разместите здесь какой-нибудь код, показывающий вашу попытку метода, который дает вам проблемы. –

+0

Добавил событие нажатия кнопки в исходный вопрос. Извините, я не уверен, как разместить в комментарии код. То, что мне нужно, - это день, когда начнется подсчет даты с даты выбора времени, а не на следующий рабочий день. Благодаря! – gary7

ответ

0

Модификация метода ниже приводит к подсчету, начинающемуся в выбранный день, а не в следующем бизнесе. Это решает проблему. Спасибо всем, кто прокомментировал!

public void AddBusinessDays(short days) 
    { 
     double sign = Convert.ToDouble(Math.Sign(days)); 
     int unsignedDays = Math.Sign(days) * days -1; //*days; added -1 to force count to start on selected day, rather than next business day. 
     for (int i = 0; i < unsignedDays; i++) 
     { 
      do 
      { 
       _date = _date.AddDays(sign); 
      } 
      while (!this.IsWorkDay); 
     } 
    } 
2

Вы читали статью, которую вы связать?

Он содержит следующий фрагмент кода для вычисления предыдущий рабочий день:

do 
{ 
    date = date.AddDays(-1.0); 
} 
while (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday || 
    _holidays.ContainsValue(date.ToString(_format))); 

Он также содержит метод для выгонки дату быть рабочий день, который выбирает следующий рабочий день:

private void check() 
{ 
    if (_type == XDateTimeType.Business && !this.IsWorkDay) 
    { 
     _date = this.NextBusinessDay(); 
    } 
} 

Если вы хотите начать с предыдущего дня, измените способ check на вызов PreviousBusinessDay. Или создайте аналогичный метод checkPrevious.

+0

Привет и спасибо за комментарий. Да, я прочитал статью. Возможно, я делаю что-то неправильно, но метод для предыдущего рабочего дня не подходит к предыдущему рабочему дню, как ожидалось, - я не знаю, почему. То, что работает в этой ситуации в выходные и праздничные дни, заключается в назначении -1 методу следующего рабочего дня. Я не хочу начинать последовательно с предыдущего рабочего дня (или следующего), скорее, он должен начинать отсчет с назначенной даты. – gary7

+0

И для комментария, который я только что сделал, я обнаружил, что seeting -1 в следующий рабочий день работает, если начальный день выпадает на субботу, если в воскресенье он переезжает в понедельник, чтобы начать подсчет. Счет должен начинаться в предыдущий рабочий день, если выбранная дата для начала - суббота, воскресенье или праздник. В противном случае дни должны быть пропущены полностью в счете. – gary7

Смежные вопросы