週の初めのDateTimeを取得するにはどうすればよいですか?


469

C#で現在の時刻だけを知って、週の始まり(日曜日と月曜日の両方)を見つけるにはどうすればよいですか?

何かのようなもの:

DateTime.Now.StartWeek(Monday);

回答:


746

拡張メソッドを使用します。彼らはすべてに対する答えです、あなたは知っています!;)

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(-1 * diff).Date;
    }
}

次のように使用できます。

DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);

15
次のようにして、これを簡素化することができます: int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
トロイ

13
トロイ、指定された日付が日曜日で、週の始まりが月曜日である場合、コードが機能するとは思わない。(日曜日-6)ではなく(日曜日+ 1)を返します
アーロンホフマン

1
場合、これは動作しませんdtUTCで、すでに週例えばの開始である2012-09-02 16:00:00ZあるMon, 03 Sep 2012 00:00:00ローカルタイムに。ですからdt、現地時間に変換するか、もう少しスマートにする必要があります。入力がUTCの場合、結果をUTCとして返す必要もあります。
行1 2012

1
@ row1 DateTime.Parse("2012-09-02 16:00:00Z")は同等の現地時間を返し、このメソッドは現地時間として同じ時間を正しく返します。を使用DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()して明示的にUTC時間を渡す場合、このメソッドはUTC時間として6日、16時間早い時刻を正しく返します。期待どおりに動作しています。
ローリング、2013年

1
これは私にとって一日ずれることがある。私がから時間コンポーネントを取り除いたら、それは私にとってはうまくいきましたdt。私が使用しましたint diff = dt.Date.DayOfWeek - startOfWeek;
Vincent Saelzler、2017年

80

私が思いつくことができる最も速い方法は:

var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek);

他の曜日を開始日にしたい場合は、終了にDayOfWeek値を追加するだけです。

var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Monday);

var tuesday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Tuesday); 

2
最も単純な答えが最善です。これはうまく
いきました

7
ラトビアでは、週は月曜日に始まります。実際に..週が日曜日に始まるのはどうしていいのだろうといつも思っています..;)
0xDEAD BEEF

このソリューションは良いです。さらに、開始したいDayOfWeekを追加することで、週の始まりをいつでも作成できます。var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek); var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek +(int)DayOfWeek.Monday);
Loligans

7
この追加されたコードは、Threezolによって説明されている状況では機能しません。週の始まりを月曜日にしたい場合、日曜日の計算では前の月曜日ではなく次の月曜日を計算します。
Giovanni B

4
はい..日曜日の場合、次のModnayを提供します..前のではありません:P
Ajay Aradhya

64

もう少し冗長で文化を認識します。

System.Globalization.CultureInfo ci = 
    System.Threading.Thread.CurrentThread.CurrentCulture;
DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
DayOfWeek today = DateTime.Now.DayOfWeek;
DateTime sow = DateTime.Now.AddDays(-(today - fdow)).Date;

4
これでエラーが発生しました:今日= SUNDAY; fdow = MONDAY; (今日-fdow)== -1; DateTime.Now.AddDays(-(-1))。Date == DateTime.Now.AddDays(+1).Date; 2010年1月2日!= 2010年1月25日!!
balexandre 2010年

3
これを日曜日に試してみると、基本的にはen-GBに対してAddDays(0-1)を実行しています。したがって、@ Sarcasticのifステートメントが必要です
Chris S、

3
CultureInfo.CurrentCultureそのようにスレッドから引き出す代わりに、現在のカルチャを使用して取得することもできます。アクセスする奇妙な方法のようです。
Hank

7
別の問題:Nowプロパティを2回呼び出すのは危険です。2つの呼び出しの間に現在の時刻が24:00(または真夜中の12:00)を過ぎた場合、日付は変更されています。
Jeppe Stig Nielsen 2013

1
この回答が実際に行うことは次のとおりです。「現在の.NET週(日曜日に始まり、土曜日に終わる、DayOfWeek列挙の番号付けによる)内で、週の最初の週である.NET週の日を見つけます。現在の文化で」。これはおそらくあなたが望むものではありません。
Mathieu Renda

36

Fluent DateTimeの使用:

var monday = DateTime.Now.Previous(DayOfWeek.Monday);
var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);

29
このためだけに依存関係を引き受けるのは嫌です。「依存関係を知って殺す」ということを思い浮かべるようです。:)
エステバンアラヤ

7
「Fluent」がどのように機能しているのに気付いた人はいますか?コードを見てください。do ... whileループを使用しています。名前を付けたくないのですが、名前を付けようと決めた場合、気持ちが悪くなります。 public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
nsimeonov 2013

10
@nsimeonovそれはオープンソースです。石を投げるのではなく、より良い実装を提供してください。
Simon

12
ええ、まるで世界中のあらゆるオープンソースソフトウェアのすべてのバグを修正するように世界中にいるよう
でした

4
「do ... while」ループの使用についての苦情から大笑いしたのでコメントしなければなりませんでした。陽気な、こっけいな!他のプログラマーがループについて身震いするのを聞いたことがありません。彼が自分のコードが実際にコンパイルされるものに気づいたとき/に気づいたときに、このピエロの顔を見たいです。
Josh Stodola

22

醜いですが、少なくとも正しい日付が返されます

システムによって設定された週の始まり:

    public static DateTime FirstDateInWeek(this DateTime dt)
    {
        while (dt.DayOfWeek != System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
            dt = dt.AddDays(-1);
        return dt;
    }

なし:

    public static DateTime FirstDateInWeek(this DateTime dt, DayOfWeek weekStartDay)
    {
        while (dt.DayOfWeek != weekStartDay)
            dt = dt.AddDays(-1);
        return dt;
    }

3
これは本当に、その単純さと読みやすさのために、より多くの投票に値します。
ProfK

このリソースも役に立ちました:markb.uk/…(週または月の最初/最後の日を取得したい場合)。
FranzHuber23

13

カルチャセーフな答えと拡張メソッドの答えを組み合わせましょう:

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
        return DateTime.Today.AddDays(-(DateTime.Today.DayOfWeek- fdow));
    }
}

12
DTもstartOfWeekがあなたの関数内で使用されるどちらも、私が最初のものではなくDateTime.Todayの使用する必要がありますね
hultqvist

2
質問のコンテキストは、.Todayまたは.Nowと同じ方法で、Datetimeから使用する追加のプロパティを必要としています。これは厄介であることに同意しますが、それは求められたものです。
Joel Coehoorn、2011

7
これは古い答えですが、非常に多くのレベルで間違っています。メソッドの引数を完全に無視することに加えて、数学は多くの場合、将来の日付を選択させます。これは、のdt代わりに使用して、負のオフセットを確保するためにDateTime.Today数式をラップし、現在のカルチャーを引数として渡す(offset + 7) % 7単一パラメーターメソッドオーバーロードを使用し、(仕様によっては)強制的にゼロオフセットから7日間のオフセット。つまり、「最終火曜日」がすでに火曜日の場合、今日は返されません。FirstDayOfWeekstartOfWeek
アーロノート

10

これはあなたに前の日曜日を与えるでしょう(私は思う):

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);

9

これは少しハックかもしれませんが、.DayOfWeekプロパティをintにキャストできます(これは列挙型であり、その基礎となるデータ型が変更されていないため、デフォルトでintになっています)を使用して、前の週の始まりを決定できます。

これは、DayOfWeek列挙型で指定された週が日曜日に始まるように見えるので、この値から1を引くと、月曜日が現在の日付より前の日数と等しくなります。また、日曜日(0)を7にマップする必要があるため、1-7 = -6の場合、日曜日は前の月曜日にマップされます。

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek;
DateTime startOfWeek = now.AddDays(1 - (int)now.DayOfWeek);

前の日曜日のコードは、この調整を行う必要がないため、より単純です:-

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
DateTime startOfWeek = now.AddDays(-(int)now.DayOfWeek);

9

月曜日に

DateTime startAtMonday = DateTime.Now.AddDays(DayOfWeek.Monday - DateTime.Now.DayOfWeek);

日曜日に

DateTime startAtSunday = DateTime.Now.AddDays(DayOfWeek.Sunday- DateTime.Now.DayOfWeek);

1
別のアプリケーションが必要でしたが、私はこれを使用して私を始めました。キャストなしの最も単純なものなので、気に入っています。操作を同じ/適切なタイプに維持します。
qxotk

1
日曜日の場合は機能しません。現在の週の始まりではなく、次の月曜日を示します。
Grant J、

また、日曜日または月曜日をコピーしましたか。私には2つの答えがあります。1つは月曜日に、もう1つは日曜日にしたい場合です。DateTime.Now.DayOfWeek; 日曜日と結果DateTime.Now.AddDays(DayOfWeek.Sunday-DateTime.Now.DayOfWeek); {10/11/2019 4:14:55μμ}日付:{10/11/2019 12:00:00πμ}日:10 DayOfWeek:日曜日DayOfYear:314時間:16種類:ローカルミリ秒:172分:14月:11秒:55ティック:637089992951723516 TimeOfDay:{16:14:55.1723516}年:2019
George Stavrou

@GrantJあなたは何の線をとりましたか??? 私はテストしたところ、うまくいきました。
George Stavrou

DateTime.Nowを2019年11月10日の日曜日を表すDateTimeに置き換えて、1つ目の方法を試しました.2019年11月4日の月曜日が表示されますが、2019年11月11日の月曜日が表示されます。ここにそれを示すフィドルを設定しました:dotnetfiddle.net/ Jw3ZiO
Grant J

5
using System;
using System.Globalization;

namespace MySpace
{
    public static class DateTimeExtention
    {
        // ToDo: Need to provide culturaly neutral versions.

        public static DateTime GetStartOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.Subtract(TimeSpan.FromDays((int)dt.DayOfWeek));
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 0, 0, 0, 0);
        }

        public static DateTime GetEndOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.GetStartOfWeek().AddDays(6);
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 23, 59, 59, 999);
        }

        public static DateTime GetStartOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetStartOfWeek();
        }

        public static DateTime GetEndOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetEndOfWeek();
        }
    }
}

3
まず、コミュニティへようこそ:)この質問にはすでにいくつかの質の高い回答があり、そのほとんどは7年前に質問されたときに投稿されました。プログラミング能力を高めるために、このような簡単な質問に答えるのは価値のあることかもしれませんが、この答えを現在の状態で投稿しても、質問には何も追加されません。あなたの答えに何か新しいものがあれば、それがどのように違うのか、そしてそれがなぜそれをより良くするのかを説明するために、数文を取ってください。
MTCoster

4

グローバリゼーションを使用してすべてをまとめ、呼び出しの一部として週の最初の日を指定できるようにします。

public static DateTime StartOfWeek ( this DateTime dt, DayOfWeek? firstDayOfWeek )
{
    DayOfWeek fdow;

    if ( firstDayOfWeek.HasValue  )
    {
        fdow = firstDayOfWeek.Value;
    }
    else
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        fdow = ci.DateTimeFormat.FirstDayOfWeek;
    }

    int diff = dt.DayOfWeek - fdow;

    if ( diff < 0 )
    {
        diff += 7;
    }

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

}

4
var now = System.DateTime.Now;

var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date;

2

これにより、週の最初の日曜日の午前0時が得られます。

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, t.Hour, t.Minute, t.Second);

これにより、最初の月曜日の午前0時が得られます。

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek - 1, t.Hour, t.Minute, t.Second);

2

これをc#で試してください。このコードを使用すると、特定の週の最初の日付と最後の日付の両方を取得できます。ここでは、日曜日が最初の日、土曜日が最後の日ですが、文化に応じて両方の日を設定できます

DateTime firstDate = GetFirstDateOfWeek(DateTime.Parse("05/09/2012").Date,DayOfWeek.Sunday);
DateTime lastDate = GetLastDateOfWeek(DateTime.Parse("05/09/2012").Date, DayOfWeek.Saturday);

public static DateTime GetFirstDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime firstDayInWeek = dayInWeek.Date;
    while (firstDayInWeek.DayOfWeek != firstDay)
        firstDayInWeek = firstDayInWeek.AddDays(-1);

    return firstDayInWeek;
}
public static DateTime GetLastDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime lastDayInWeek = dayInWeek.Date;
    while (lastDayInWeek.DayOfWeek != firstDay)
        lastDayInWeek = lastDayInWeek.AddDays(1);

    return lastDayInWeek;
}

2

いくつか試してみましたが、月曜日から始まる1週間で問題を解決できなかったため、次の月曜日が日曜日になります。だから私はそれを少し修正して、このコードで動作させました:

int delta = DayOfWeek.Monday - DateTime.Now.DayOfWeek;
DateTime monday = DateTime.Now.AddDays(delta == 1 ? -6 : delta);
return monday;

「今週の月曜日」の問題は文化に依存しているようです(Ericからの回答とCerveserからのコメントも参照)。簡略化:dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Damian Vogel

2

ステップ1:静的クラスを作成する

  public static class TIMEE
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(-1 * diff).Date;
    }
    public static DateTime EndOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 - (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(1 * diff).Date;
    }
}

ステップ2:このクラスを使用して、週の開始日と終了日を取得します。

 DateTime dt =TIMEE.StartOfWeek(DateTime.Now ,DayOfWeek.Monday);
        DateTime dt1 = TIMEE.EndOfWeek(DateTime.Now, DayOfWeek.Sunday);

(6 - (dt.DayOfWeek - startOfWeek)) % 7私が書いた単体テストに対して、週末の終わりが必要でした。
mlhDev

1

次のメソッドは、必要なDateTimeを返す必要があります。日曜日が週の最初の日である場合はtrue、月曜日の場合はfalseを渡します。

private DateTime getStartOfWeek(bool useSunday)
{
    DateTime now = DateTime.Now;
    int dayOfWeek = (int)now.DayOfWeek;

    if(!useSunday)
        dayOfWeek--;

    if(dayOfWeek < 0)
    {// day of week is Sunday and we want to use Monday as the start of the week
    // Sunday is now the seventh day of the week
        dayOfWeek = 6;
    }

    return now.AddDays(-1 * (double)dayOfWeek);
}

1

例をありがとう。私は常に "CurrentCulture"を週の最初の日として使用する必要があり、配列については正確なDaynumberを知る必要がありました。

public static class DateTimeExtensions
{
    //http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week
    //http://stackoverflow.com/questions/1788508/calculate-date-with-monday-as-dayofweek1
    public static DateTime StartOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return dt.AddDays(-1 * diff).Date;
    }

    public static int DayNoOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return diff + 1; //Make it 1..7
    }
}

1

まだ誰もこれに正しく答えているようには見えません。誰かが必要な場合に備えて、ここにソリューションを貼り付けます。次のコードは、週の最初の日が月曜日か日曜日かどうかに関係なく機能します。

public static class DateTimeExtension
{
  public static DateTime GetFirstDayOfThisWeek(this DateTime d)
  {
    CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
    var first = (int)ci.DateTimeFormat.FirstDayOfWeek;
    var current = (int)d.DayOfWeek;

    var result = first <= current ?
      d.AddDays(-1 * (current - first)) :
      d.AddDays(first - current - 7);

    return result;
  }
}

class Program
{
  static void Main()
  {
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
    Console.WriteLine("Current culture set to en-US");
    RunTests();
    Console.WriteLine();
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("da-DK");
    Console.WriteLine("Current culture set to da-DK");
    RunTests();
    Console.ReadLine();
  }

  static void RunTests()
  {
    Console.WriteLine("Today {1}: {0}", DateTime.Today.Date.GetFirstDayOfThisWeek(), DateTime.Today.Date.ToString("yyyy-MM-dd"));
    Console.WriteLine("Saturday 2013-03-02: {0}", new DateTime(2013, 3, 2).GetFirstDayOfThisWeek());
    Console.WriteLine("Sunday 2013-03-03: {0}", new DateTime(2013, 3, 3).GetFirstDayOfThisWeek());
    Console.WriteLine("Monday 2013-03-04: {0}", new DateTime(2013, 3, 4).GetFirstDayOfThisWeek());
  }
}

1

C#でのModuloは-1mod7(6である必要があります、c#は-1を返します)でうまく機能しません。

private static DateTime GetFirstDayOfWeek(DateTime date)
    {
        return date.AddDays(-(((int)date.DayOfWeek - 1) - (int)Math.Floor((double)((int)date.DayOfWeek - 1) / 7) * 7));
    }

1

週の終わりにも同じ(@Compileのスタイルで)これ:

    public static DateTime EndOfWeek(this DateTime dt)
    {
        int diff = 7 - (int)dt.DayOfWeek;

        diff = diff == 7 ? 0 : diff;

        DateTime eow = dt.AddDays(diff).Date;

        return new DateTime(eow.Year, eow.Month, eow.Day, 23, 59, 59, 999) { };
    }

0

あなたは素晴らしい傘ライブラリを使うことができます:

using nVentive.Umbrella.Extensions.Calendar;
DateTime beginning = DateTime.Now.BeginningOfWeek();

ただし、月曜日を週の最初の日として保存しているようです(プロパティを参照)。nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn)。そのため、以前のローカライズされたソリューションの方が少し優れています。残念です。

編集:質問を詳しく見ると、傘も実際に機能するようです:

// Or DateTime.Now.PreviousDay(DayOfWeek.Monday)
DateTime monday = DateTime.Now.PreviousMonday(); 
DateTime sunday = DateTime.Now.PreviousSunday();

先週の月曜日を月曜日に尋ねると、7日後になることに注意してください。しかし、これはBeginningOfWeekバグのように見えるを使用する場合にも当てはまります:(。


0

これは、週の初めと週の終わりの両方の日付を返します。

    private string[] GetWeekRange(DateTime dateToCheck)
    {
        string[] result = new string[2];
        TimeSpan duration = new TimeSpan(0, 0, 0, 0); //One day 
        DateTime dateRangeBegin = dateToCheck;
        DateTime dateRangeEnd = DateTime.Today.Add(duration);

        dateRangeBegin = dateToCheck.AddDays(-(int)dateToCheck.DayOfWeek);
        dateRangeEnd = dateToCheck.AddDays(6 - (int)dateToCheck.DayOfWeek);

        result[0] = dateRangeBegin.Date.ToString();
        result[1] = dateRangeEnd.Date.ToString();
        return result;

    }

週、月、四半期、年の初め /終わりを計算するための完全なコードをブログ ZamirsBlogに投稿しました


0
    namespace DateTimeExample
    {
        using System;

        public static class DateTimeExtension
        {
            public static DateTime GetMonday(this DateTime time)
            {
                if (time.DayOfWeek != DayOfWeek.Monday)
                    return GetMonday(time.AddDays(-1)); //Recursive call

                return time;
            }
        }

        internal class Program
        {
            private static void Main()
            {
                Console.WriteLine(DateTime.Now.GetMonday());
                Console.ReadLine();
            }
        }
    } 

答えを拡張してコードの説明を含めることができますか?それはあなたが思っている以上に読者を助けます。
gunr2171 2014年

再帰の使用は、非常に貧弱な実装です。再帰を使用できるからといって、そうする必要はありません。ここで提供されている他のソリューションよりも低速で、メモリを大量に消費します。
mikecamimo 2017

0

ここにいくつかの答えの組み合わせがあります。これは、カルチャを渡すことができる拡張メソッドを使用します。カルチャを渡さない場合は、現在のカルチャが使用されます。これにより、最大限の柔軟性と再利用が可能になります。

/// <summary>
/// Gets the date of the first day of the week for the date.
/// </summary>
/// <param name="date">The date to be used</param>
/// <param name="cultureInfo">If none is provided, the current culture is used</param>
/// <returns>The date of the beggining of the week based on the culture specifed</returns>
public static DateTime StartOfWeek(this DateTime date, CultureInfo cultureInfo=null) =>         
             date.AddDays(-1 * (7 + (date.DayOfWeek - (cultureInfo??CultureInfo.CurrentCulture).DateTimeFormat.FirstDayOfWeek)) % 7).Date;

使用例:

public static void TestFirstDayOfWeekExtension() {          
        DateTime date = DateTime.Now;
        foreach(System.Globalization.CultureInfo culture in CultureInfo.GetCultures(CultureTypes.UserCustomCulture | CultureTypes.SpecificCultures)) {
            Console.WriteLine($"{culture.EnglishName}: {date.ToShortDateString()} First Day of week: {date.StartOfWeek(culture).ToShortDateString()}");
        }
    }

0

土曜日、日曜日、または曜日を問わず、現在の週(土日)を超えないようにしたい場合は、このコードで説明します。

public static DateTime GetDateInCurrentWeek(this DateTime date, DayOfWeek day)
{
    var temp = date;
    var limit = (int)date.DayOfWeek;
    var returnDate = DateTime.MinValue;

    if (date.DayOfWeek == day) return date;

    for (int i = limit; i < 6; i++)
    {
        temp = temp.AddDays(1);

        if (day == temp.DayOfWeek)
        {
            returnDate = temp;
            break;
        }
    }
    if (returnDate == DateTime.MinValue)
    {
        for (int i = limit; i > -1; i++)
        {
            date = date.AddDays(-1);

            if (day == date.DayOfWeek)
            {
                returnDate = date;
                break;
            }
        }
    }
    return returnDate;
}

0

私たちはワンライナーが好きです:現在のカルチャの週の最初の日と現在の日の差を取得し、現在の日から日数を差し引きます

var weekStartDate = DateTime.Now.AddDays(-((int)now.DayOfWeek - (int)DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek));

0

Compile This 'Answerから続けて、次の方法を使用して、任意の曜日の日付を取得します。

public static DateTime GetDayOfWeek(this DateTime dt, DayOfWeek day)
{            
    int diff = (7 + (dt.DayOfWeek - DayOfWeek.Monday)) % 7;
    var monday = dt.AddDays(-1 * diff).Date;

    switch (day)
    {
        case DayOfWeek.Tuesday:
            return monday.AddDays(1).Date;

        case DayOfWeek.Wednesday:
            return monday.AddDays(2).Date;

        case DayOfWeek.Thursday:
            return monday.AddDays(3).Date;

        case DayOfWeek.Friday:
            return monday.AddDays(4).Date;

        case DayOfWeek.Saturday:
            return monday.AddDays(5).Date;

        case DayOfWeek.Sunday:
            return monday.AddDays(6).Date;
    }

    return monday;
}

0

再帰を使用する関数を作成してみてください。あなたのDateTimeオブジェクトは入力であり、関数は週の始まりを表す新しいDateTimeオブジェクトを返します。

    DateTime WeekBeginning(DateTime input)
    {
        do
        {
            if (input.DayOfWeek.ToString() == "Monday")
                return input;
            else
                return WeekBeginning(input.AddDays(-1));
        } while (input.DayOfWeek.ToString() == "Monday");
    }

このコードは問題を解決する可能性がありますが、これが問題を解決する方法と理由の説明含めると、投稿の品質が向上し、おそらくより多くの投票が得られます。あなたが今尋ねている人だけでなく、あなたが将来の読者のための質問に答えていることを忘れないでください。回答を編集して説明を追加し、適用される制限と前提を示してください。
David Buck

0

この方法で計算すると、新しい曜日の開始を示す曜日を選択できます(例では月曜日を選択しました)。

月曜日である日にこの計算を実行すると、前の月曜日ではなく現在の月曜日が得られることに注意してください。

//Replace with whatever input date you want
DateTime inputDate = DateTime.Now;

//For this example, weeks start on Monday
int startOfWeek = (int)DayOfWeek.Monday;

//Calculate the number of days it has been since the start of the week
int daysSinceStartOfWeek = ((int)inputDate.DayOfWeek + 7 - startOfWeek) % 7;

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