web-dev-qa-db-ja.com

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

前の月と初日を取得する簡単な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);

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

128
Jeremy Boyd
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行が本当に必要な場合は、それらをインラインにします。

281
andleer

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

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

それから先月の終わりを得るために日を引く

dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1);

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

dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1);
22
MikeW

fluent DateTimeの使用 https://github.com/FluentDateTime/FluentDateTime

        var lastMonth = 1.Months().Ago().Date;
        var firstDayOfMonth = lastMonth.FirstDayOfMonth();
        var lastDayOfMonth = lastMonth.LastDayOfMonth();
11
Simon
DateTime LastMonthLastDate = DateTime.Today.AddDays(0 - DateTime.Today.Day);
DateTime LastMonthFirstDate = LastMonthLastDate.AddDays(1 - LastMonthLastDate.Day);
8
Franci Penov

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

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

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

5
CodeMonkey

拡張メソッドを使用するアプローチ:

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拡張機能について。

4
rp.

Eコマースの標準的な使用例は、クレジットカードの有効期限であるMM/yyです。 1日ではなく1秒を引きます。そうでない場合、カードは有効期限月の最後の日まで有効期限が切れたように見えます。

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

これは、マイク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);
1
B. Clay Shannon
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
Maksym Gontar

日付時刻が厳密なカレンダー日付ではない可能性がある場合は、終了日除外比較の使用を検討する必要があります。これにより、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
Amy B