Получить даты первого и последнего дня предыдущего месяца в c#



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



Я LINQ-ifying веб-приложение опроса, и они сжали новое требование.



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



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


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

1502   11  

11 ответов:

var today = DateTime.Today;
var month = new DateTime(today.Year, today.Month, 1);       
var first = month.AddMonths(-1);
var last = month.AddDays(-1);

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

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

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

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

dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1);

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

dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1);

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

        var lastMonth = 1.Months().Ago().Date;
        var firstDayOfMonth = lastMonth.FirstDayOfMonth();
        var lastDayOfMonth = lastMonth.LastDayOfMonth();
DateTime LastMonthLastDate = DateTime.Today.AddDays(0 - DateTime.Today.Day);
DateTime LastMonthFirstDate = LastMonthLastDate.AddDays(1 - LastMonthLastDate.Day);

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

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.

Я использую этот простой фразой:

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

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

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

DateTime expiration = DateTime.Parse("07/2013");
DateTime endOfTheMonthExpiration = new DateTime(
  expiration.Year, expiration.Month, 1).AddMonths(1).AddSeconds(-1);

Если есть вероятность, что ваши даты не являются строгими календарными датами, вы должны рассмотреть возможность использования сравнения исключений enddate... Это позволит вам не пропустить любые запросы, созданные в течение 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);
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());

EDIT: это не способ сделать это!
Если сегодня.Месяц-1 = 0, как и в январе, это вызовет исключение. Это явно тот случай, когда быть умным доставляет вам неприятности!

немного проще, чем принято отвечать:

var today = DateTime.Today
var first = new DateTime(today.Year, today.Month - 1, 1);
var last  = new DateTime(today.Year, today.Month, 1).AddDays(-1);

сохраняет дополнительное создание даты и времени.

это взять на себя ответ Майка W:

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);

Comments

    Ничего не найдено.