день минус один метод для расчета рабочего дня c # - PullRequest
0 голосов
/ 22 января 2012

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

Мои требования, например: день начала 21.01.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;

Ответы [ 2 ]

2 голосов
/ 22 января 2012

Вы читали статью, на которую ссылаетесь?

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

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 голосов
/ 05 февраля 2012

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

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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...