Ответ 1
var today = DateTime.Today;
var month = new DateTime(today.Year, today.Month, 1);
var first = month.AddMonths(-1);
var last = month.AddDays(-1);
Встраивайте их, если вам действительно нужна одна или две строки.
Я не могу придумать легкий один или два лайнера, которые получат предыдущие месяцы в первый день и последний день.
Я LINQ-ifying веб-приложение опроса, и они сжимали новое требование.
Опрос должен включать все запросы на обслуживание за предыдущий месяц. Итак, если это 15 апреля, мне нужны все идентификаторы запросов Marches.
var RequestIds = (from r in rdc.request
where r.dteCreated >= LastMonthsFirstDate &&
r.dteCreated <= LastMonthsLastDate
select r.intRequestId);
Я просто не могу думать о датах легко без переключения. Если я не слепой и не замечаю внутреннего метода его выполнения.
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 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());
РЕДАКТИРОВАТЬ: Это не способ сделать это!
Если today.Month - 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);
Сохраняет дополнительное создание DateTime.
Канонический случай использования в электронной торговле - это даты истечения срока действия кредитной карты, MM/yy. Вычтите одну секунду вместо одного дня. В противном случае срок действия карты истекает в течение всего последнего дня истечения месяца.
DateTime expiration = DateTime.Parse("07/2013");
DateTime endOfTheMonthExpiration = new DateTime(
expiration.Year, expiration.Month, 1).AddMonths(1).AddSeconds(-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);
Если есть вероятность, что ваши даты не являются строгими календарными датами, вам следует подумать об использовании сравнений исключений 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);