В C#, как Вы преобразовываете тип данных TimeSpan в DateTime?

7
задан program247365 21 July 2009 в 21:16
поделиться

5 ответов

Похоже, ваш VB действительно возвращает промежуток времени, предположительно в днях. Вот ближайший прямой перевод:

public TimeSpan CalculateCoverageOne(DateTime EffDate1, DateTime CurrDate, DateTime? EndDate1)
{
    return (EndDate1 == null) ? TimeSpan.Zero :
           (CurrDate < EndDate1) ? (CurrDate - EffDate1) :
           (EndDate1.AddDays(1) - EffDate1);
}

Если вместо этого вам нужно просто подсчитать количество дней, просто верните свойство TimeSpan's Days:

public int CalculateCoverageOne(DateTime EffDate1, DateTime CurrDate, DateTime? EndDate1)
{
    return ((EndDate1 == null) ? TimeSpan.Zero :
            (CurrDate < EndDate1) ? (CurrDate - EffDate1) :
            (EndDate1.AddDays(1) - EffDate1)).Days;
}

И для хорошей оценки, вот как я бы очистил вашу окончательную версию:

public int CalculateCoverageOne(DateTime dateCurrentDate, DateTime dateEffectiveDate, DateTime dateEffDateOne, DateTime dateEndDateOne)
{
    TimeSpan ts;
    if (dateEffDateOne == DateTime.MinValue)
    {
        ts = TimeSpan.Zero;
    }
    else if (dateEffectiveDate <= dateEndDateOne)
    {
        ts = dateCurrentDate - dateEffDateOne;
    }
    else
    {
        ts = (dateEndDateOne - dateEffDateOne) + new TimeSpan(1, 0, 0, 0);
    }
    return ts.Days;
}
3
ответ дан 6 December 2019 в 12:53
поделиться

DateTime - это тип значения . Итак, DateTime нельзя присвоить null. Но вы можете использовать специальное значение, например DateTime.MinValue, чтобы указать, что вы пытались указать нулевым значением.

DateTime представляет дату (и время), например «22 июля 2009 года». Это означает, что вы не должны использовать этот тип для представления временного интервала, например, «9 дней». TimeSpan - это тип, предназначенный для этого.

dateCurrentDate.Subtract (dateEffDateOne) (или, что то же самое, dateCurrentDate-dateEffDateOne ) - это разница между двумя датами, то есть , интервал времени. Итак, я предлагаю вам изменить тип возвращаемого значения вашей функции на TimeSpan.

TimeSpan также является типом значения, поэтому вы можете использовать, например, TimeSpan.Zero вместо null.

2
ответ дан 6 December 2019 в 12:53
поделиться

Получите TimeSpan, затем вычтите это значение из DateTime, чтобы получить желаемую дату. Для вашего внутреннего оператора IF это будет выглядеть так:

TimeSpan estSpan = dateCurrentDate.Subtract(dateEffDateOne);
return dateCurrentDate.Subtract(estSpan);

EDIT: вы также можете захотеть вернуть DateTime.MaxValue и попросить вызывающую функцию проверить максимальное значение вместо возврата null.

TimeSpan представляет не конкретный момент времени, а сам диапазон. Чтобы получить дату, вы можете использовать метод Add или перегрузку метода Subtract объекта DateTime , который принимает TimeSpan . Я не могу сказать, как именно это должно выглядеть, поскольку я не знаю, что представляют собой разные даты в вашем коде.

В последнем случае вы можете просто использовать возвращаемое значение из метода AddDays, но с отрицательным значение (чтобы вычесть один день вместо добавления одного):

return dateEffDateOne.AddDays(-1);
7
ответ дан 6 December 2019 в 12:53
поделиться

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

Спасибо всем за отличные ответы. Это помогло мне встать на правильный путь.

    public int CalculateCoverageOne(DateTime dateCurrentDate, DateTime dateEffectiveDate, DateTime dateEffDateOne, DateTime dateEndDateOne)
    {
        //Coverage1=
        //IIf(IsNull([EffDate1]),0,
            //IIf([CurrDate]<=[EndDate1],
                //[CurrDate]-[EffDate1],
                    //[EndDate1]-[EffDate1]+1))

        if (dateEffDateOne.Equals(TimeSpan.Zero))
        {
            return (TimeSpan.Zero).Days;
        }
        else
        {
            if (dateEffectiveDate <= dateEndDateOne)
            {
                return (dateCurrentDate - dateEffDateOne).Days;
            }
            else
            {
                return (dateEndDateOne - dateEffDateOne).Add(new TimeSpan(1, 0, 0, 0)).Days;
            }
        }
    }
1
ответ дан 6 December 2019 в 12:53
поделиться

Получите TimeSpan, затем вычтите его из DateTime, чтобы получить желаемую дату. Для вашего внутреннего оператора IF это будет выглядеть так:

TimeSpan estSpan = dateCurrentDate.Subtract(dateEffDateOne);
return dateCurrentDate.Subtract(estSpan);

EDIT: вы также можете захотеть вернуть DateTime.MaxValue и заставить вызывающую функцию проверять максимальное значение вместо возврата null.

3
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: