Bagaimana saya bisa mendapatkan DateTime untuk awal minggu?

469

Bagaimana saya menemukan awal minggu (baik hari Minggu dan Senin) mengetahui waktu saat ini di C #?

Sesuatu seperti:

DateTime.Now.StartWeek(Monday);
GateKiller
sumber

Jawaban:

746

Gunakan metode ekstensi. Mereka adalah jawaban untuk semuanya, Anda tahu! ;)

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

Yang bisa digunakan sebagai berikut:

DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
Kompilasi ini
sumber
15
Anda dapat menyederhanakan ini sebagai berikut: int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
Troy
13
Troy, saya tidak percaya kode Anda berfungsi jika tanggal yang diberikan adalah hari Minggu dan awal minggu Anda adalah hari Senin. Ini akan kembali (Minggu +1) alih-alih (Minggu - 6)
Aaron Hoffman
1
Ini tidak berfungsi jika dtUTC dan sudah merupakan awal minggu misalnya 2012-09-02 16:00:00Zyang ada Mon, 03 Sep 2012 00:00:00di waktu setempat. Jadi itu perlu dikonversi dtke waktu lokal atau melakukan sesuatu yang sedikit lebih pintar. Juga harus mengembalikan hasilnya sebagai UTC jika inputnya adalah UTC.
row1
1
@ row1 DateTime.Parse("2012-09-02 16:00:00Z")mengembalikan setara waktu-lokal, dan metode ini dengan benar mengembalikan waktu yang sama, sebagai waktu lokal. Jika Anda menggunakan DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()waktu UTC secara eksplisit, metode ini mengembalikan dengan benar 6 hari, 16 jam sebelumnya, sebagai waktu UTC. Ini bekerja persis seperti yang saya harapkan.
Rawling
1
Ini kadang-kadang tidak cocok untuk saya. Ini bekerja untuk saya setelah saya melepaskan komponen waktu dt. Saya menggunakanint diff = dt.Date.DayOfWeek - startOfWeek;
Vincent Saelzler
80

Cara tercepat yang bisa saya lakukan adalah:

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

Jika Anda ingin hari lain dalam seminggu menjadi tanggal mulai, yang perlu Anda lakukan adalah menambahkan nilai DayOfWeek ke akhir

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

var tuesday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Tuesday); 
Eric
sumber
2
jawaban yang paling sederhana adalah yang terbaik, yang ini bekerja dengan baik, tetapi budaya bergantung
Cerveser
7
Di Latvia minggu dimulai pada hari Senin .. Sebenarnya .. Saya selalu bertanya-tanya bagaimana seminggu bisa dimulai pada hari Minggu .. sepertinya aneh bagi saya ..;)
0xDEAD BEEF
Solusi ini bagus. Selain itu, Anda dapat membuat awal minggu setiap hari dengan menambahkan DayOfWeek yang ingin Anda mulai. var sunday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek); var monday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek + (int) DayOfWeek.Monday);
Loligans
7
Kode tambahan ini tidak berfungsi untuk situasi yang dijelaskan oleh Threezol. Jika Anda ingin awal minggu adalah Senin, pada hari Minggu perhitungan memberi Anda hari Senin yang akan datang, bukan yang sebelumnya.
Giovanni B
4
Ya .. Untuk hari Minggu, ia memberi Modnay berikutnya .. bukan yang sebelumnya: P
Ajay Aradhya
64

Sedikit lebih verbose dan sadar budaya:

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;
Jason Navarrete
sumber
4
mendapat kesalahan dengan ini: hari ini = MINGGU; fdow = SENIN; (hari ini - fdow) == -1; DateTime.Now.AddDays (- (- 1)). Date == DateTime.Now.AddDays (+1) .Date; 01-02-2010! = 25-01-2010 !!
Balexandre
3
Jika Anda mencoba ini pada hari Minggu, maka pada dasarnya melakukan AddDays (0 - 1) untuk en-GB. Jadi itu perlu pernyataan if @ Sarcastic
Chris S
3
Anda juga bisa mendapatkan budaya saat ini menggunakan CultureInfo.CurrentCulturedaripada menariknya dari utas seperti itu. Sepertinya cara aneh untuk mengaksesnya.
Hank
7
Masalah lain: Berbahaya memanggil Nowproperti dua kali. Jika waktu saat ini berlalu 24:00 (atau 12:00 tengah malam) antara dua panggilan, tanggal akan berubah.
Jeppe Stig Nielsen
1
Apa jawaban ini sebenarnya adalah sebagai berikut: "di dalam minggu .NET saat ini (dimulai pada hari Minggu dan berakhir pada hari Sabtu, sesuai dengan penomoran enumerasi DayOfWeek), cari hari minggu .NET yang merupakan yang pertama dalam minggu dalam budaya saat ini ". Ini mungkin bukan yang Anda inginkan.
Mathieu Renda
36

Menggunakan Fluent DateTime :

var monday = DateTime.Now.Previous(DayOfWeek.Monday);
var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);
Simon
sumber
29
Aku benci mengambil ketergantungan hanya untuk ini. "Ketahuilah ketergantunganmu dan bunuh mereka" tampaknya muncul di pikiran. :)
Esteban Araya
7
Apakah ada yang memperhatikan BAGAIMANA "Fasih" bekerja? Lihat saja kodenya. Ini menggunakan do ... while. Tidak ingin menyebutnya nama tetapi jika saya memutuskan untuk melakukannya tidak akan menyenangkan. public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
nsimeonov
10
@nsimeonov ini adalah open source. jangan ragu untuk memberikan implementasi yang lebih baik daripada melempar batu.
Simon
12
Ya, seolah-olah saya memiliki semua waktu di dunia untuk memperbaiki setiap bug di setiap perangkat lunak open source di dunia ...
nsimeonov
4
Saya harus berkomentar karena saya mendapat tawa besar dari keluhan tentang penggunaan loop "do ... while"! Lucu sekali! Saya belum pernah mendengar programmer lain bergidik tentang loop sebelumnya. Akan sangat senang melihat wajah badut ini ketika / jika dia menyadari kode apa yang sebenarnya dikompilasi ke bawah.
Josh Stodola
22

Jelek tetapi setidaknya memberikan tanggal yang tepat kembali

Dengan awal minggu ditetapkan oleh sistem:

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

Tanpa:

    public static DateTime FirstDateInWeek(this DateTime dt, DayOfWeek weekStartDay)
    {
        while (dt.DayOfWeek != weekStartDay)
            dt = dt.AddDays(-1);
        return dt;
    }
Janspeed
sumber
3
Ini benar-benar layak mendapat lebih banyak suara karena kesederhanaan dan keterbacaannya.
ProfK
Sumber daya ini juga membantu: markb.uk/… (Jika Anda ingin mendapatkan hari pertama / terakhir dalam seminggu atau sebulan).
FranzHuber23
13

Mari kita gabungkan jawaban yang aman untuk budaya dan jawaban metode ekstensi:

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));
    }
}
Joel Coehoorn
sumber
12
tidak dt atau startOfWeek digunakan dalam fungsi Anda, saya kira yang pertama harus digunakan daripada DateTime.
Hari ini
2
Konteks pertanyaannya adalah menginginkan properti tambahan untuk menggunakan Datetime dengan cara yang sama dengan .Hari ini atau. Sekarang. Saya setuju ini aneh, tapi itu yang diminta.
Joel Coehoorn
7
Saya tahu ini adalah jawaban lama, tetapi itu salah pada banyak tingkatan; selain benar-benar mengabaikan argumen metode, matematika akan menyebabkannya memilih tanggal di masa depan dalam banyak kasus. Ini seharusnya ditulis untuk menggunakan dtalih-alih DateTime.Today, untuk membungkus matematika dalam (offset + 7) % 7untuk memastikan offset negatif, untuk menggunakan metode parameter tunggal yang berlebihan yang melewati budaya saat ini FirstDayOfWeeksebagai startOfWeekargumen, dan mungkin (tergantung pada spesifikasi) untuk memaksa suatu zero offset hingga 7 hari offset, sehingga "Selasa lalu" tidak kembali hari ini jika sudah Selasa.
Aaronaught
10

Ini akan memberi Anda hari Minggu sebelumnya (saya pikir):

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

Ini mungkin sedikit peretasan, tetapi Anda dapat membuang properti .DayOfWeek ke int (ini enum dan karena itu tidak memiliki tipe data yang mendasarinya mengubahnya default ke int) dan menggunakannya untuk menentukan awal awal minggu ini. .

Tampaknya minggu yang ditentukan dalam enum DayOfWeek dimulai pada hari Minggu, jadi jika kita mengurangi 1 dari nilai ini, itu akan sama dengan berapa hari Senin sebelum tanggal saat ini. Kita juga perlu memetakan hari Minggu (0) sama dengan 7 jadi mengingat 1 - 7 = -6 hari Minggu akan memetakan ke Senin sebelumnya: -

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

Kode untuk hari Minggu sebelumnya lebih sederhana karena kami tidak perlu melakukan penyesuaian ini: -

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

Untuk hari Senin

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

Untuk hari minggu

DateTime startAtSunday = DateTime.Now.AddDays(DayOfWeek.Sunday- DateTime.Now.DayOfWeek);
George Stavrou
sumber
1
Saya memiliki kebutuhan aplikasi yang berbeda, namun saya menggunakan ini untuk membuat saya maju. Saya suka karena ini adalah yang paling sederhana, tanpa casting - menjaga operasi dalam tipe yang sama / sesuai.
qxotk
1
Ini tidak berfungsi ketika hari itu hari Minggu. Itu memberi hari Senin berikutnya, bukan awal minggu ini.
Grant J
Anda juga menyalin Minggu atau Senin. Saya punya 2 jawaban Satu jika Anda ingin untuk hari Senin dan 2 pada jika Anda ingin untuk hari Minggu ..... Saya baru saja mengujinya dan berfungsi dengan baik untuk saya. DateTime.Now.DayOfWeek; Minggu Dan Hasil DateTime.Now.AddDays (DayOfWeek.Sunday - DateTime.Now.DayOfWeek); {10/11/2019 4:14:55 μμ} Tanggal: {10/11/2019 12:00:00 πμ} Hari: 10 HariBulan Minggu: Hari MingguTahun: 314 Jam: 16 Jenis: Milidetik Lokal: 172 Menit: 14 Bulan : 11 Kedua: 55 Pilihan: 637089992951723516 WaktuOfDay: {16: 14: 55.1723516} Tahun: 2019
George Stavrou
@GJJJ Apa baris yang Anda ambil ??? Saya baru saja menguji dan berfungsi dengan baik.
George Stavrou
Saya mencoba yang pertama, mengganti DateTime Anda. Sekarang dengan DateTime mewakili hari Minggu 10 November 2019. Seharusnya memberikan Senin 4 November 2019 tetapi memberikan Senin 11 November 2019. Saya telah membuat biola mendemonstrasikannya di sini: 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();
        }
    }
}
Beruang coklat
sumber
3
Pertama, selamat datang di komunitas :) Sudah ada beberapa jawaban berkualitas tinggi untuk pertanyaan ini, yang sebagian besar telah diposting tujuh tahun yang lalu ketika pertanyaan diajukan. Meskipun mungkin merupakan latihan yang bermanfaat untuk mencoba menjawab pertanyaan-pertanyaan sederhana seperti ini untuk meningkatkan kemampuan pemrograman Anda, memposting jawaban ini dalam keadaan saat ini tidak menambah apa pun pada pertanyaan. Jika ada sesuatu yang baru tentang jawaban Anda, silakan ambil beberapa kalimat untuk menjelaskan perbedaannya dan mengapa itu membuatnya lebih baik.
MTCoster
4

Menyatukan semuanya, dengan Globalisasi dan memungkinkan untuk menentukan hari pertama dalam seminggu sebagai bagian dari panggilan yang kita miliki

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;

}
Matthew Hintzen
sumber
4
var now = System.DateTime.Now;

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

Ini akan memberi Anda tengah malam pada hari Minggu pertama minggu itu:

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

Ini memberi Anda hari Senin pertama di tengah malam:

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

coba dengan ini di c # .Dengan kode ini Anda bisa mendapatkan tanggal pertama dan tanggal terakhir dari minggu tertentu. Di sini hari Minggu adalah hari pertama dan hari Sabtu adalah hari terakhir tetapi Anda dapat mengatur hari kedua sesuai dengan budaya Anda

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;
}
yeasir007
sumber
2

Sudah mencoba beberapa tetapi tidak menyelesaikan masalah dengan satu minggu dimulai pada hari Senin, menghasilkan memberi saya Senin yang akan datang pada hari Minggu. Jadi saya memodifikasinya sedikit dan membuatnya bekerja dengan kode ini:

int delta = DayOfWeek.Monday - DateTime.Now.DayOfWeek;
DateTime monday = DateTime.Now.AddDays(delta == 1 ? -6 : delta);
return monday;
Threezool
sumber
Tampaknya masalah 'Senin yang akan datang' tergantung pada budaya (lihat juga jawaban dari Eric dan komentar dari Cerveser.) Namun, jika Anda tidak perlu memperhitungkan hari Minggu (seperti dengan janji bisnis biasa) formula Anda dapat disederhanakan:dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Damian Vogel
2

Langkah 1: Buat kelas statis

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

Langkah2: Gunakan kelas ini untuk memulai dan mengakhiri hari dalam seminggu

 DateTime dt =TIMEE.StartOfWeek(DateTime.Now ,DayOfWeek.Monday);
        DateTime dt1 = TIMEE.EndOfWeek(DateTime.Now, DayOfWeek.Sunday);
Muhammad Abbas
sumber
Akhir Minggu diperlukan (6 - (dt.DayOfWeek - startOfWeek)) % 7untuk saya terhadap unit test yang saya tulis.
mlhDev
1

Metode berikut harus mengembalikan DateTime yang Anda inginkan. Pass in true untuk hari Minggu adalah hari pertama dalam seminggu, salah untuk hari Senin:

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);
}
dipecat
sumber
1

Terima kasih atas contohnya. Saya harus selalu menggunakan "CurrentCulture" hari pertama dalam seminggu dan untuk array saya perlu tahu persis Daynumber .. jadi di sini adalah ekstensi pertama saya:

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
    }
}
pengguna324365
sumber
1

Sepertinya belum ada yang menjawab ini dengan benar. Saya akan menempelkan solusi saya di sini kalau-kalau ada yang membutuhkannya. Kode berikut berfungsi terlepas dari apakah hari pertama dalam seminggu adalah Senin atau minggu atau sesuatu yang lain.

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());
  }
}
Andreas Kromann
sumber
1

Modulo di C # berfungsi buruk untuk -1mod7 (harus 6, c # pengembalian -1) jadi ... "oneliner" solusi untuk ini akan terlihat seperti ini :)

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

Sama untuk akhir minggu (dengan gaya @Compile jawaban ini):

    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) { };
    }
FH
sumber
0

Anda dapat menggunakan perpustakaan Payung yang sangat baik :

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

Namun, mereka tidak tampaknya telah disimpan Senin sebagai hari pertama dalam minggu itu (lihat propertinVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn ), sehingga solusi lokal sebelumnya sedikit lebih baik. Disayangkan

Sunting : melihat lebih dekat pada pertanyaan, sepertinya Payung mungkin benar-benar berfungsi untuk itu juga:

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

Meskipun perlu dicatat bahwa jika Anda meminta Senin sebelumnya pada hari Senin, itu akan memberi Anda tujuh hari kembali. Tapi ini juga berlaku jika Anda menggunakan BeginningOfWeek, yang sepertinya seperti bug :(.

Domenik
sumber
0

Ini akan mengembalikan tanggal awal minggu dan akhir minggu:

    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;

    }

Saya telah memposting kode lengkap untuk menghitung awal / akhir minggu, bulan, kuartal dan tahun di blog saya ZamirsBlog

Zamir
sumber
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();
            }
        }
    } 
Denis
sumber
Bisakah Anda memperluas jawaban Anda dengan memasukkan penjelasan kode Anda? Ini membantu pembaca lebih dari yang Anda pikirkan.
gunr2171
Menggunakan rekursi adalah implementasi yang sangat buruk. Hanya karena Anda dapat menggunakan rekursi tidak berarti Anda harus melakukannya. Akan lebih lambat dan lebih intensif memori daripada solusi lain yang disediakan di sini.
mikecamimo
0

Ini adalah kombinasi dari beberapa jawaban. Ini menggunakan metode ekstensi yang memungkinkan budaya untuk diteruskan, jika tidak dilewati, budaya saat ini digunakan. Ini akan memberinya fleksibilitas maksimal dan digunakan kembali.

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

Contoh penggunaan:

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()}");
        }
    }
Mike
sumber
0

jika Anda ingin hari Sabtu atau Minggu atau hari apa pun dalam minggu tetapi tidak melebihi minggu ini (Sat-Sun), saya memberi Anda kode ini.

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;
}
Ali Umair
sumber
0

Kami menyukai one-liners: Dapatkan perbedaan antara hari pertama budaya saat ini minggu dan hari ini lalu kurangi jumlah hari dari hari saat ini

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

Sebagai lanjutan dari Kompilasi Jawaban 'Ini, gunakan metode berikut untuk mendapatkan tanggal untuk setiap hari dalam seminggu:

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;
}
Rowan Richards
sumber
0

Cobalah untuk membuat fungsi yang menggunakan rekursi. Objek DateTime Anda adalah input dan fungsi mengembalikan objek DateTime baru yang merupakan singkatan dari awal minggu.

    DateTime WeekBeginning(DateTime input)
    {
        do
        {
            if (input.DayOfWeek.ToString() == "Monday")
                return input;
            else
                return WeekBeginning(input.AddDays(-1));
        } while (input.DayOfWeek.ToString() == "Monday");
    }
mihauuuu
sumber
Meskipun kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan tentang bagaimana dan mengapa ini menyelesaikan masalah akan sangat membantu untuk meningkatkan kualitas posting Anda, dan mungkin menghasilkan lebih banyak suara. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang. Harap edit jawaban Anda untuk menambahkan penjelasan dan berikan indikasi tentang batasan dan asumsi apa yang berlaku.
David Buck
0

Menghitung dengan cara ini memungkinkan Anda memilih hari dalam seminggu yang menunjukkan awal minggu baru (dalam contoh saya memilih Senin).

Perhatikan bahwa melakukan perhitungan ini untuk hari yang merupakan hari Senin akan memberikan hari Senin saat ini dan bukan yang sebelumnya.

//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);
C. Keats
sumber