Ближайший завершенный квартал - PullRequest
11 голосов
/ 22 декабря 2009

Есть ли функция C #, которая даст мне последний день последнего завершенного квартала с указанной датой?

Например,

var lastDayOfLastQuarter = SomeFunction(jan 3, 2010);

установит lastDayOfLastQuarter = 31 декабря 2009

Ответы [ 7 ]

26 голосов
/ 22 декабря 2009
public static DateTime NearestQuarterEnd(this DateTime date) {
    IEnumerable<DateTime> candidates = 
        QuartersInYear(date.Year).Union(QuartersInYear(date.Year - 1));
    return candidates.Where(d => d < date.Date).OrderBy(d => d).Last();
}

static IEnumerable<DateTime> QuartersInYear(int year) {
    return new List<DateTime>() {
        new DateTime(year, 3, 31),
        new DateTime(year, 6, 30),
        new DateTime(year, 9, 30),
        new DateTime(year, 12, 31),
    };
}

Использование:

DateTime date = new DateTime(2010, 1, 3);
DateTime quarterEnd = date.NearestQuarterEnd();

Этот метод имеет преимущество в том, что если у вас есть нечетное определение кварталов (например, финансовый год отличается от календарного года), метод QuartersInYear легко модифицируется для обработки этого.

2 голосов
/ 22 декабря 2009

Простая функция может вычислить последние дни последнего завершенного месяца:

public static DateTime LastQuarter(DateTime date)
{
    return new DateTime(date.Year, date.Month - ((date.Month - 1) % 3), 1).AddDays(-1);
}
2 голосов
/ 22 декабря 2009

Предполагая, что кварталы всегда заканчиваются с интервалом в 3 месяца, вы можете сделать:

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

public DateTime LastDayOfLastQuarter(DateTime date)
{
    int result = (int)(date.Month/3)

    switch (result)
    {
        // January - March
        case 0:
            return new DateTime(date.Year - 1, 12, 31);
        // April - June
        case 1:
            return new DateTime(date.Year, 3, 31);
        // July - September
        case 2:
            return new DateTime(date.Year, 6, 30);
        // October - December
        case 3:
            return new DateTime(date.Year, 9, 30);
    }
}
2 голосов
/ 22 декабря 2009

Попробуйте это:
AddMonths(-(d.Month-1) % 3)) перемещает значение даты в эквивалентный день первого месяца квартала, а затем AddDays (-day) возвращается к последнему дню предыдущего месяца.

  DateTime d = Datetime.Now;
  DateTime lastDayOfLastQuarter = d.AddMonths(-((d.Month-1)%3)).AddDays(-d.Day);
1 голос
/ 27 июня 2011
Func<int, int> q = (i) => { return ((i - 1) / 3) + 1; };

Тест:

Enumerable.Range(1, 12).Select(i => q(i));
1 голос
/ 22 декабря 2009

Вот простая функция, чтобы дать вам последний день текущего квартала (при условии, что вы используете стандартный календарь).

DateTime LastDayOfQuarter(DateTime today)
{
    int quarter = (today.Month-1) / 3;
    int lastMonthInQuarter = (quarter +1) * 3;
    int lastDayInMonth =  DateTime.DaysInMonth(today.Year, lastMonthInQuarter);
    return new DateTime(today.Year, lastMonthInQuarter, lastDayInMonth); 
}

Надеюсь, это поможет.

0 голосов
/ 30 ноября 2010

Вы можете использовать простую инструкцию переключения, чтобы проверить, на какой квартал приходится данная дата, и вернуть последний день этого квартала.

...