2009-02-26 229 views
118

我想不出一個簡單的一兩個班輪,將得到前幾個月的第一天和最後一天。獲取上個月的第一天和最後一天的日期在C#

我LINQ-ifying的一項調查顯示Web應用程序,他們擠在一個新的要求。

調查必須包括所有前一個月的服務請求。所以如果是4月15日,我需要所有的Marches請求ID。

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

我只是無法想象的日期很容易沒有開關。除非我是盲目的,並且忽略了內部的做法。

回答

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

如果你真的需要一兩行,就可以聯機。

21

我已經在過去做到了這一點的方式是先拿到這個月

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

然後第一天減去一天拿到上月底

dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1); 

然後減去每月能拿到前一個月的第一天

dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1); 
+0

網2.0,Today.Days不工作。 – 2009-02-26 18:22:37

+0

DateTime.Today.Day你的意思是 – 2009-02-26 18:34:56

+3

+1,但要迂腐,你最好評估一下DateTime.Today並存儲在本地變量中。如果您的代碼在午夜之前開始執行納秒,則對DateTime.Today的兩次連續調用可能會返回不同的值。 – Joe 2009-02-26 18:36:46

8
DateTime LastMonthLastDate = DateTime.Today.AddDays(0 - DateTime.Today.Day); 
DateTime LastMonthFirstDate = LastMonthLastDate.AddDays(1 - LastMonthLastDate.Day); 
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()); 
0

如果有你的日期時間沒有嚴格的日曆日期任何機會,你應該考慮使用結束日期排除比較... 這會防止你失蹤一月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); 
4

的一種方法使用擴展方法:

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擴展。

1

編輯:這不是做的方法!
如果today.Month - 1 = 0,與1月一樣,這將引發異常。這顯然是聰明讓你陷入麻煩的情況!

accepted answer稍微簡單一些:

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

節省額外的日期時間創造。

2

在電子商務的規範使用情況是信用卡到期日期,MM/YY。減去一秒而不是一天。否則,卡在過期月份的整個最後一天將出現過期。

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

我用這簡單的一行:

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

要知道,它保留的時間。

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); 
相關問題