在 c # 中获取前一个月的第一天和最后一天的日期

我想不出一个简单的一个或两个班轮,可以得到前几个月的第一天和最后一天。

我正在给一个调查网络应用程序进行 LINQ 化,他们在其中加入了一个新的要求。

调查必须包括前一个月的所有服务请求。所以如果是4月15日,我需要所有马奇家的人申请身份证。

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

我只是想不出没有开关的日期。除非我是个盲人,忽略了一种内在的方法。

186868 次浏览

我过去这样做的方式是,首先得到这个月的第一天

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

然后减去一天得到上个月底

dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1);

然后减去一个月得到上个月的第一天

dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1);
DateTime LastMonthLastDate = DateTime.Today.AddDays(0 - DateTime.Today.Day);
DateTime LastMonthFirstDate = LastMonthLastDate.AddDays(1 - LastMonthLastDate.Day);
var today = DateTime.Today;
var month = new DateTime(today.Year, today.Month, 1);
var first = month.AddMonths(-1);
var last = month.AddDays(-1);

如果你真的需要一两行的话,把它们排成一行。

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

如果您的日期时间不是严格的日历日期,您应该考虑使用终止日期排除比较..。 这将防止您错过在1月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);

使用扩展方法的方法:

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 一些有创意的日期时间扩展。

使用 Fluent DateTime https://github.com/FluentDateTime/FluentDateTime

        var lastMonth = 1.Months().Ago().Date;
var firstDayOfMonth = lastMonth.FirstDayOfMonth();
var lastDayOfMonth = lastMonth.LastDayOfMonth();

电子商务中的规范用例是信用卡过期日期 MM/广州欢聚时代。减去一秒而不是一天。否则,该卡将在到期月份的最后一天到期。

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

我使用这个简单的俏皮话:

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

请注意,它保留了时间。

以下是迈克• W (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);