Получить даты первого и последнего дня предыдущего месяца в c#
Я не могу придумать простой один или два вкладыша, что бы попасть в предыдущие месяцы первый день и последний день.
Я LINQ-ifying веб-приложение опроса, и они сжали новое требование.
опрос должен включать все заявки на обслуживание за предыдущий месяц. Так что если это 15 апреля, мне нужны все марши запрос идентификаторов.
var RequestIds = (from r in rdc.request
where r.dteCreated >= LastMonthsFirstDate &&
r.dteCreated <= LastMonthsLastDate
select r.intRequestId);
Я просто не могу думать о датах легко без переключателя. Если только я не слеп и не упускаю из виду внутренний метод делающий это.
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