前月の最初と最後の日の日付をC#で取得する


140

私は前月の初日と最終日を取得するような簡単な1つまたは2つのライナーを考えることはできません。

私は調査WebアプリをLINQ化していて、新しい要件を詰め込んでいます。

調査には、前月のすべてのサービスリクエストが含まれている必要があります。したがって、4月15日の場合、すべてのMarchesリクエストIDが必要です。

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

スイッチなしでは日付を簡単に考えることはできません。私が盲目で、それを行うための内部的な方法を見落としているのでない限り。

回答:


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

1行または2行が本当に必要な場合は、それらをインライン化します。


2
IIRC DateTime.Todayは非常に負荷の高い呼び出しなので、最初に変数に値を格納する方が適切です。とにかく良い答え:)
LeandroLópez

2
@andleerここにあなたが言及したように動作します素敵なライブラリだfluentdatetime.codeplex.comは
マシュー・ロック

@MatthewLock、リンクが壊れているようです。
ギジェルモグティエレス2013


2
完全な日時を使用してエントリが保存されている場合、このクエリは月の最終日の午前12時以降に始まるクエリを取得できない可能性があることを指摘しておきます。これを解決するには、最後の行を変更してvar last = month.AddTicks(-1);を読み取ります。
SixOThree 2014

23

私が過去にこれを行った方法は、今月の最初の日を最初に取得することです

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

次に、日を引いて先月の終わりを取得します

dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1);

次に、月を減算して前月の最初の日を取得します

dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1);

4
+1ですが、簡潔にするために、DateTime.Todayを1回評価してローカル変数に格納する方が適切です。コードが真夜中前のナノ秒の実行を開始した場合、DateTime.Todayを2回連続して呼び出すと、異なる値が返される可能性があります。
ジョー

はい、ありがとうございます。皆さんは正解です。
MikeW 2009

コンパイラの
面倒さを軽減

1
比較されたようupvoted return date.AddDays(-(date.Day-1))return new DateTime(date.Year, date.Month, 1);(923msが同じオブジェクトを返す809ms対アップNEWING)と最初の2000上の反復の性能が優れている
Terry_Brown


9
DateTime LastMonthLastDate = DateTime.Today.AddDays(0 - DateTime.Today.Day);
DateTime LastMonthFirstDate = LastMonthLastDate.AddDays(1 - LastMonthLastDate.Day);

DateTime.Today.Days-> 'System.DateTime'には 'Days'の定義が含まれていません...
andleer

5

私はこのシンプルなワンライナーを使用します:

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

時間を保持することに注意してください。


1
私が欲しかったもの、三項内で使用できる簡潔な表現。ありがとう!
Joe Ballard、

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

影響を受けたいくつかのDateTime拡張機能については、このリンクhttp://www.codeplex.com/fluentdatetimeを参照してください 。


3

eコマースの標準的な使用例は、クレジットカードの有効期限、MM / yyです。1日ではなく1秒を減算します。それ以外の場合、カードは有効期限月の最終日全体で期限切れと表示されます。

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

1

日時が厳密なカレンダーの日付ではない可能性がある場合は、終了日の除外比較を使用することを検討してください...これにより、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);

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
DateTime.Nowが最初の呼び出しで2009-01-31を生成し、2番目の呼び出しで2009-02-01を生成する場合はどうなりますか?
Amy B

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.