с учетом начальной даты, как найти конечную дату, которая имеет 365 или 366 дней в зависимости от високосного года - PullRequest
2 голосов
/ 03 ноября 2011
public static DateTime GetBudgetYearEndDateConsideringLeapYear(DateTime budgetYearStartDate)
    {
        DateTime endDate = DateTime.MinValue;
        if (budgetYearStartDate == null)
            throw new ArgumentNullException("budgetYearStartDate must be provided before calling this method");

        int startingDateMonth = budgetYearStartDate.Month;
        if (startingDateMonth > 2) /// Leap year for the starting year is escaped because  Month is NOT February
        {
            endDate = budgetYearStartDate.AddDays(365);
            bool isEndYearLeapYear = DateTime.IsLeapYear(endDate.Year);

            if (isEndYearLeapYear)
            {
                return endDate.AddDays(1);
            }
            return endDate;
        }
        else  // started from JAN/ FEB
        {
            if (DateTime.IsLeapYear(budgetYearStartDate.Year))
            {
                return budgetYearStartDate.AddDays(366);
            }
            return budgetYearStartDate.AddDays(365);
        }

    }

Чего мне здесь не хватает

Ответы [ 4 ]

3 голосов
/ 03 ноября 2011

Что не так с:

public static DateTime GetBudgetYearEndDateConsideringLeapYear
    (DateTime budgetYearStartDate)
{
    return budgetYearStartDate.AddYears(1);
}

?Другими словами, возвращайте дату год от даты начала, независимо от того, является ли это високосным годом.

Обратите внимание на пару вещей:

  • Вы должны рассмотреть, чтовы хотите, чтобы результат был, если дата начала 29 февраля
  • Проверка на ничтожность бессмысленна, учитывая, что DateTime является типом значения
2 голосов
/ 03 ноября 2011

AddYears учитывает високосные годы, поэтому ...

budgetYearEndDateConsideringLeapYear = budgetYearStartDate.AddYears(1);
1 голос
/ 03 ноября 2011

Попробуйте это:

DateTime dtStartOfThisYear = new DateTime( 2011, 11 , 1 ) ;
DateTime dtStartOfNextYear = dtStartOfThisyear.AddYears(1) ;

Если вы откроете метод AddYears() в Reflector, вы увидите, что он просто вызывает метод AddMonths(), передав ему значение years * 12. Умно, а?

И если вы раскроете AddMonths(), вы увидите

public DateTime AddMonths(int months)
{
    if ( ( months < -120000 ) || ( months > 0x1d4c0 ) )
    {
        throw new ArgumentOutOfRangeException("months", Environment.GetResourceString("ArgumentOutOfRange_DateTimeBadMonths"));
    }

    int datePart = this.GetDatePart( 0 ) ;
    int month    = this.GetDatePart( 2 ) ;
    int day      = this.GetDatePart( 3 ) ;

    int num4     = ( month - 1 ) + months ;
    if ( num4 >= 0 )
    {
        month     = ( num4 % 12 ) + 1 ;
        datePart += num4 / 12 ;
    }
    else
    {
        month     = 12 + ( ( num4 +  1 ) % 12 ) ;
        datePart +=        ( num4 - 11 ) / 12   ;
    }

    if ( ( datePart < 1 ) || ( datePart > 0x270f ) )
    {
        throw new ArgumentOutOfRangeException("months", Environment.GetResourceString("ArgumentOutOfRange_DateArithmetic"));
    }

    int num5 = DaysInMonth( datePart , month );
    if ( day > num5 )
    {
        day = num5 ;
    }

    return new DateTime(((ulong) (DateToTicks(datePart, month, day) + (this.InternalTicks % 0xc92a69c000L))) | this.InternalKind);
}

Я полагаю, вы обнаружите, что этот код выполняет то, что вы хотите: например, если вы начнете 29 февраля високосного года и добавите 1 год, вы закончите 28 февраля следующего года.

1 голос
/ 03 ноября 2011

Как насчет startDate.AddYears(1).AddDays(-1);?

Это предполагает, что при заданной дате начала 1 июля вы хотите, чтобы дата окончания 30 июня. В опубликованном вами примере предполагается, что вы хотите, чтобы 1 июля -> 1 июля, в этом случае это будет startDate.AddYears(1);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...