DateTimeを月初に設定


97

C#でDateTimeを月の最初に設定するにはどうすればよいですか?


今月の初め?
Phil Gan

1
それについて何を得るために、... 1..doesと毎月の日付を開始するには、彼は月の開始日を知りたい
Shekhar_Pro

1月にいる場合は、2011年1月1日と2月に表示され、2011年2月1日
学習します。

あなたはこれ
V4Vendetta '15

回答:


204
var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year,now.Month,1);

62
ヒント:DateTime.Now値を繰り返し使用する場合は、常に変数に入れて使用します。このコードが真夜中に実行された場合、エラーが発生する可能性はわずかです。への2つの呼び出しはDateTime.Now、真夜中の両側で発生する可能性があり、奇妙な影響を引き起こす可能性があります。
フレドリックモルク

いい視点ね。大晦日の真夜中は、これが問題を引き起こす可能性がある時期だと思います。
Nick Jones、

1
お正月だけではありません。それは毎月の最終日の真夜中に問題になるでしょう。いずれにしても、月末の真夜中のその非常にナノ秒で実行された場合にのみ問題になります。しかし、コードを修正したので、今はすべて順調です。
Doug S

1
なぜ「DateTime」の代わりに「var」を使用するのですか?
markthewizard1234 2015

4
@ markthewizard1234主な理由は、C#プログラマーが怠惰だからです。したがって、varは3文字しかないため、可能な限り使用します。他にも理由はありますが、多くの人がこれをする主な理由はこれだと思います。
Tim Pohlmann、2016

41

このようなものはうまくいくでしょう

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

4
Fredrik MorkがNick Jonesの回答にコメントしたように、Datetimeを複数回使用するときは変数に格納して、月の最終日の午前0時前後に問題が発生しないようにするのが最善です。つまり、DateTime today = DateTime.Today; DateTime firstDay = today.AddDays(1-today.Day);
Doug S

9
public static DateTime FirstDayOfMonth(this DateTime current)
{
    return current.AddDays(1 - current.Day);
}

1
タイムゾーンを保持するため、これはより良い方法です。
Rosdi Kasim、

8

パーティーには少し遅れますが、ここで私のためにトリックをした拡張メソッドがあります

public static class DateTimeExtensions
{
  public static DateTime FirstDayOfMonth(this DateTime dt)
  {
    return new DateTime(dt.Year, dt.Month, 1);
  }
}

1
これの問題は、元のタイムゾーンを維持しないことです。
Mike Cole

2
DateTime now = DateTime.Now;
DateTime date = new DateTime(now.Year, now.Month, 1);

あなたはDateTime.Nowの代わりに他のものを使うことができます


2

Nick Answerに基づいた拡張メソッドとSOに基づいた拡張メソッドを作成しました

public static class DateTimeExtensions 
{
    /// <summary>
    /// get the datetime of the start of the week
    /// </summary>
    /// <param name="dt"></param>
    /// <param name="startOfWeek"></param>
    /// <returns></returns>
    /// <example>
    /// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
    /// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
    /// </example>
    /// <remarks>http://stackoverflow.com/a/38064/428061</remarks>
    public static System.DateTime StartOfWeek(this System.DateTime dt, DayOfWeek startOfWeek)
    {
        var diff = dt.DayOfWeek - startOfWeek;
        if (diff < 0)
            diff += 7;

        return dt.AddDays(-1 * diff).Date;
    }

    /// <summary>
    /// get the datetime of the start of the month
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    /// <remarks>http://stackoverflow.com/a/5002582/428061</remarks>
    public static System.DateTime StartOfMonth(this System.DateTime dt) =>
        new System.DateTime(dt.Year, dt.Month, 1);


    /// <summary>
    /// get datetime of the start of the year
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static System.DateTime StartOfYear(this System.DateTime dt) => 
         new System.DateTime(dt.Year, 1, 1);

}

0

これは効率的で正しいはずです。

DateTime RoundDateTimeToMonth(DateTime time)
{
    long ticks = time.Ticks;
    return new DateTime((ticks / TimeSpan.TicksPerDay - time.Day + 1) * TimeSpan.TicksPerDay, time.Kind);
}

ここでticks / TimeSpan.TicksPerDayは、指定された日までの日数を返しtime- time.Day + 1この数を月の初めにリセットします。


0

これがお役に立てば幸いです。

textbox1.Text = "01-" + DateTime.Now.ToString( "MMM-yyyy");


-2
var currentDate = DateTime.UtcNow.Date;
var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1));

3
これはふぼの答えのかなりの複製です、あなたは思いませんか?
Thomas Ayoub

2
このコードは問題を解決する可能性がありますが、それがなぜ/どのように機能するかを説明する説明を追加することを常にお勧めします。
BDL 2017

@ThomasAyoub-いいえ、これには時間枠が含まれないため、これはfuboの回答のかなりの複製ではありません。
ジェイシャー

@BDL-説明を必要としない理解は非常に簡単だと思います。しかし参考までに、私は現在のUtc日付を取得し、それから(現在の日付の日-1)を引いて、月の開始日、つまり1(0ではなく、そのため1を引いた理由)を取得しました。そして、はい、これは間違いなく問題を解決します。
ジェイシャー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.