Получить даты первого и последнего дня предыдущего месяца в c # - PullRequest
126 голосов
/ 26 февраля 2009

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

Я использую LINQ для веб-приложения опроса, и они выдвинули новое требование.

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

var RequestIds = (from r in rdc.request 
                  where r.dteCreated >= LastMonthsFirstDate && 
                  r.dteCreated <= LastMonthsLastDate 
                  select r.intRequestId);

Я просто не могу придумать даты без переключателя. Если я не слепой и не обращаю внимания на внутренний способ сделать это.

Ответы [ 10 ]

278 голосов
/ 26 февраля 2009
var today = DateTime.Today;
var month = new DateTime(today.Year, today.Month, 1);       
var first = month.AddMonths(-1);
var last = month.AddDays(-1);

Вставьте их, если вам действительно нужна одна или две строки.

21 голосов
/ 26 февраля 2009

То, как я делал это в прошлом, это первый день в этом месяце

dFirstDayOfThisMonth = DateTime.Today.AddDays( - ( DateTime.Today.Day - 1 ) );

Затем вычтите день, чтобы получить конец прошлого месяца

dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1);

Затем вычтите месяц, чтобы получить первый день предыдущего месяца

dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1);
11 голосов
/ 04 сентября 2009

с использованием Fluent DateTime https://github.com/FluentDateTime/FluentDateTime

        var lastMonth = 1.Months().Ago().Date;
        var firstDayOfMonth = lastMonth.FirstDayOfMonth();
        var lastDayOfMonth = lastMonth.LastDayOfMonth();
8 голосов
/ 26 февраля 2009
DateTime LastMonthLastDate = DateTime.Today.AddDays(0 - DateTime.Today.Day);
DateTime LastMonthFirstDate = LastMonthLastDate.AddDays(1 - LastMonthLastDate.Day);
5 голосов
/ 06 мая 2014

Я использую этот простой однострочный:

public static DateTime GetLastDayOfPreviousMonth(this DateTime date)
{
    return date.AddDays(-date.Day);
}

Имейте в виду, что оно сохраняет время.

4 голосов
/ 26 февраля 2009

Подход с использованием методов расширения:

class Program
{
    static void Main(string[] args)
    {
        DateTime t = DateTime.Now;

        DateTime p = t.PreviousMonthFirstDay();
        Console.WriteLine( p.ToShortDateString() );

        p = t.PreviousMonthLastDay();
        Console.WriteLine( p.ToShortDateString() );


        Console.ReadKey();
    }
}


public static class Helpers
{
    public static DateTime PreviousMonthFirstDay( this DateTime currentDate )
    {
        DateTime d = currentDate.PreviousMonthLastDay();

        return new DateTime( d.Year, d.Month, 1 );
    }

    public static DateTime PreviousMonthLastDay( this DateTime currentDate )
    {
        return new DateTime( currentDate.Year, currentDate.Month, 1 ).AddDays( -1 );
    }
}

Смотрите эту ссылку http://www.codeplex.com/fluentdatetime для некоторых расширений DateTime.

3 голосов
/ 10 июня 2012

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

DateTime expiration = DateTime.Parse("07/2013");
DateTime endOfTheMonthExpiration = new DateTime(
  expiration.Year, expiration.Month, 1).AddMonths(1).AddSeconds(-1);
1 голос
/ 15 апреля 2016

Это ответ на вопрос Майка У:

internal static DateTime GetPreviousMonth(bool returnLastDayOfMonth)
{
    DateTime firstDayOfThisMonth = DateTime.Today.AddDays( - ( DateTime.Today.Day - 1 ) );
    DateTime lastDayOfLastMonth = firstDayOfThisMonth.AddDays (-1);
    if (returnLastDayOfMonth) return lastDayOfLastMonth;
    return firstDayOfThisMonth.AddMonths(-1);
}

Вы можете назвать это так:

dateTimePickerFrom.Value = GetPreviousMonth(false);
dateTimePickerTo.Value = GetPreviousMonth(true);
1 голос
/ 26 февраля 2009

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

DateTime now = DateTime.Now;
DateTime thisMonth = new DateTime(now.Year, now.Month, 1);
DateTime lastMonth = thisMonth.AddMonths(-1);

var RequestIds = rdc.request
  .Where(r => lastMonth <= r.dteCreated)
  .Where(r => r.dteCreated < thisMonth)
  .Select(r => r.intRequestId);
1 голос
/ 26 февраля 2009
DateTime now = DateTime.Now;
int prevMonth = now.AddMonths(-1).Month;
int year = now.AddMonths(-1).Year;
int daysInPrevMonth = DateTime.DaysInMonth(year, prevMonth);
DateTime firstDayPrevMonth = new DateTime(year, prevMonth, 1);
DateTime lastDayPrevMonth = new DateTime(year, prevMonth, daysInPrevMonth);
Console.WriteLine("{0} {1}", firstDayPrevMonth.ToShortDateString(),
  lastDayPrevMonth.ToShortDateString());
...