在c#中获取上个月的第一天和最后一天的date

我想不出一个简单的一两个class轮是否会在前几个月的第一天和最后一天。

我是LINQ-ifying一个调查networking应用程序,他们挤压了一个新的要求。

调查必须包括上个月的所有服务请求。 所以如果是4月15日,我需要所有的Marches请求ID。

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

没有开关,我无法轻松地想到date。 除非我是盲目的,忽视了内部的做法。

 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,就像在1月一样,这将会抛出一个exception。 这显然是巧妙的让你陷入麻烦的情况!

比接受的答案简单一点:

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

保存一个额外的date时间创build。

电子商务中的规范用例是信用卡到期日,MM / yy。 减去一秒而不是一天。 否则,卡在过期月份的整个最后一天将显示过期。

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

如果您的date时间不是严格的日历date,您应该考虑使用enddate排除比较…这将防止您错过1月31date间创build的任何请求。

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

这是Mike 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);