DateTime'ı haftanın başında nasıl alabilirim?


469

C # 'daki geçerli saati bilerek haftanın başlangıcını (Pazar ve Pazartesi) nasıl bulabilirim?

Gibi bir şey:

DateTime.Now.StartWeek(Monday);

Yanıtlar:


746

Bir uzantı yöntemi kullanın. Onlar her şeyin cevabı, biliyorsun! ;)

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

Hangi aşağıdaki gibi kullanılabilir:

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

15
Bunu aşağıdaki gibi basitleştirebilirsiniz: int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
Troy

13
Troy, verilen tarih bir Pazar ve haftanın başlangıcı Pazartesi ise kodunuzun işe yaradığına inanmıyorum. (Pazar - 6) yerine (Pazar + 1) dönecek
Aaron Hoffman

1
Bu işe yaramazsa dtUTC ve şimdiden hafta ör başlangıcıdır 2012-09-02 16:00:00Zolan Mon, 03 Sep 2012 00:00:00yerel saatte. Bu yüzden dtyerel saate dönüşmeli veya biraz daha akıllıca bir şey yapmalı. Giriş UTC ise sonucu UTC olarak döndürmek de gerekir.
row1

1
@ row1 DateTime.Parse("2012-09-02 16:00:00Z"), yerel saat eşdeğerini döndürür ve bu yöntem, yerel saatle aynı saati doğru şekilde döndürür. DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()UTC saatini açıkça iletmek için kullanırsanız , bu yöntem 6 gün 16 saat önce UTC saati olarak doğru bir şekilde döndürür. Tam beklediğim gibi çalışıyor.
Ocak'ta Rawling

1
Bu bazen benim için bir gün kapalı olurdu. Zaman bileşenini çıkardığımda benim için çalıştı dt. Kullandımint diff = dt.Date.DayOfWeek - startOfWeek;
Vincent Saelzler

80

Gelebileceğim en hızlı yol:

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

Haftanın başka bir gününün başlangıç ​​tarihiniz olmasını istiyorsanız, yapmanız gereken tek şey DayOfWeek değerini sonuna eklemek.

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
en basit cevaplar en iyisidir, bu iyi çalıştı, ancak kültür bağlıydı
Cerveser

7
Letonya hafta Pazartesi başlıyor .. Aslında .. Ben her zaman bir hafta Pazar günü nasıl başlayabilir merak ediyorum .. bana garip görünüyor ..;)
0xDEAD BEEF

Bu çözüm iyi. Ayrıca, başlamak istediğiniz DayOfWeek'i ekleyerek haftanın her gününü başlatabilirsiniz. var sunday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek); var monday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek + (int) DayOfWeek.Monday);
Loligans

7
Eklenen bu kod, Threezol tarafından açıklanan durum için çalışmaz. Haftanın başlangıcının Pazartesi olmasını istiyorsanız, Pazar günü hesaplama size bir önceki günü değil, önümüzdeki Pazartesi günü verir.
Giovanni B

4
Evet .. Pazar için, bir sonraki Modnay'ı veriyor .. bir önceki değil: P
Ajay

64

Biraz daha ayrıntılı ve kültüre duyarlı:

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
bununla ilgili bir hata var: bugün = PAZAR; fdow = PAZARTESİ; (bugün - fdow) == -1; DateTime.Now.AddDays (- (- 1)) Date == DateTime.Now.AddDays (+1) .Tarih; 01-02-2010! = 25-01-2010 !!
balexandre

3
Bunu bir Pazar günü denerseniz, temelde en-GB için AddDays (0 - 1) yapıyor. Bu yüzden @ Sarcastic'in if ifadesine ihtiyacı var
Chris S

3
Mevcut kültürü CultureInfo.CurrentCultureböyle bir iplikten çıkarmak yerine kullanarak da alabilirsiniz . Erişmek için garip bir yol gibi görünüyor.
Hank

7
Başka bir sorun: NowMülkü iki kez aramak tehlikelidir . Geçerli saat, iki arama arasında 24:00 (veya gece yarısı 12:00) geçerse, tarih değişmiş olacaktır.
Jeppe Stig Nielsen

1
Bu cevabın gerçekte yaptığı şey şu: "geçerli .NET haftasında (pazardan başlayıp cumartesi günü, DayOfWeek numaralandırmasının numaralandırmasına göre), haftanın ilk günü olan .NET haftasının gününü bulun mevcut kültürde ". Muhtemelen istediğin bu değil.
Mathieu Renda

36

Akıcı DateTime kullanma :

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

29
Sadece bunun için bir bağımlılık yapmaktan nefret ederim. "Bağımlılıklarınızı bilin ve öldürün" akla geliyor gibi görünüyor. :)
Esteban Araya

7
Herkes nasıl "Akıcı" çalıştığını fark ettiniz mi? Sadece koda bir göz atın. Bir do ... while döngüsü kullanıyor. İsimleri aramak istemiyorum ama yapmaya karar verirsem hoş olmayacak. public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
nsimeonov

10
@nsimeonov bu açık kaynak. lütfen taş atmak yerine daha iyi bir uygulama sağlamaktan çekinmeyin.
Simon

12
Evet, sanki dünyadaki her açık kaynaklı yazılımdaki her bir hatayı düzeltmek için her zaman vardı ...
nsimeonov

4
"Do ... while" döngüsü kullanma hakkında şikayet büyük bir kahkaha var çünkü yorum yapmak zorunda kaldı! Neşeli! Daha önce bir döngü hakkında başka bir programcının titremesini hiç duymamıştım. Bu palyaçonun yüzünü, kodunun gerçekte neyi derlediğini fark ettiğinde / görürse görmek isterim.
Josh Stodola

22

Çirkin ama en azından doğru tarihleri ​​geri veriyor

Sistem tarafından ayarlanan haftanın başlangıcı ile:

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

olmadan:

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

3
Bu, basitliği ve okunabilirliği nedeniyle gerçekten daha fazla oyu hak ediyor.
ProfK

Bu kaynak da yardımcı oldu: markb.uk/… (Bir haftanın veya ayın ilk / son gününü almak istiyorsanız).
FranzHuber23

13

Kültüre güvenli cevabı ve uzatma yöntemi cevabını birleştirelim:

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
Ne dt ne de startOfWeek işlevinizde kullanılmaz, sanırım DateTime yerine
ilkinin

2
Sorunun bağlamı, Datetime'dan .Today veya .Now ile aynı şekilde kullanılması için ek bir özellik istemektir. Bunun garip olduğunu kabul ediyorum, ama istenen şey bu.
Joel Coehoorn

7
Bunun eski bir cevap olduğunu biliyorum, ama birçok seviyede yanlış; yöntem argümanlarını tamamen görmezden gelmeye ek olarak, matematik birçok durumda gelecekteki bir tarih seçmesine neden olacaktır . Bu , matematiksel bir negatif ofset sağlamak için kullanmak dtyerine , geçerli kültürün argüman olarak geçen tek parametreli bir aşırı yükleme yöntemi kullanmak ve muhtemelen (spesifikasyona bağlı olarak) bir sıfır ofset 7 günlük ofset, böylece "geçen Salı" zaten Salı ise bugün dönmez. DateTime.Today(offset + 7) % 7FirstDayOfWeekstartOfWeek
Aaronaught

10

Bu size önceki Pazar günü verecektir (sanırım):

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

9

Bu biraz hack olabilir, ancak .DayOfWeek özelliğini bir int'e atayabilirsiniz (bir enumdur ve temel veri türü değişmediğinden varsayılan olarak int olarak değiştirilmiştir) ve bunu haftanın önceki başlangıcını belirlemek için kullanabilirsiniz .

DayOfWeek enum'da belirtilen hafta Pazar günü başlar, bu nedenle bu değerden 1 çıkarırsak, Pazartesi gününün geçerli tarihten önceki gün sayısına eşit olur. Ayrıca Pazar gününü (0) 7'ye eşitlememiz gerekir, böylece 1 - 7 = -6 Pazar günü bir önceki Pazartesi günü eşleşir: -

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

Bu ayarlamayı yapmak zorunda olmadığımız için önceki Pazar'ın kodu daha basit: -

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

9

Pazartesi için

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

Pazar için

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

1
Farklı bir uygulama ihtiyacım vardı, ancak bunu devam ettirmek için kullandım. Operasyonu aynı / uygun tiplerde tutmak - herhangi bir döküm olmadan en basit olanı seviyorum.
qxotk

1
Gün Pazar olduğunda bu işe yaramaz. Geçerli haftanın başlangıcını değil, bir sonraki Pazartesi günü verir.
Grant

Ayrıca Pazar günü ya da Pazartesi günü de kopyaladınız. Ben 2 cevap var Pazartesi için istiyorsanız ve Pazar için isterseniz 2on ..... Ben sadece test ve benim için iyi çalışıyor. DateTime.Now.DayOfWeek; Pazar Ve Sonuç DateTime.Now.AddDays (DayOfWeek.Sunday - DateTime.Now.DayOfWeek); {10/11/2019 4:14:55 μμ} Tarih: {10/11/2019 12:00:00 }μ} Gün: 10 GünOf Hafta: Pazar GünüOfay: 314 Saat: 16 Tür: Yerel Milisaniye: 172 Dakika: 14 Ay : 11 Saniye: 55 Keneler: 637089992951723516 TimeOfDay: {16: 14: 55.1723516} Yıl: 2019
George Stavrou

@GrantJ Hangi hattı seçtiniz ??? Sadece test ettim ve iyi çalışıyor.
George Stavrou

İlkini DateTime ile değiştirdim.Şimdi 10 Kasım 2019 Pazar gününü temsil eden bir DateTime ile denedim. 4 Kasım 2019 Pazartesi vermeli, ancak 11 Kasım 2019 Pazartesi veriyor. Burada gösteren bir keman kurdum
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
Öncelikle, topluluğa hoş geldiniz :) Bu soruya zaten birçok yüksek kaliteli cevap var, bunların çoğu yedi yıl önce soru sorulduğunda gönderildi. Programlama yeteneklerinizi ilerletmek için bunun gibi basit soruları yanıtlamaya çalışmak faydalı olabilir, ancak bu yanıtı mevcut durumuna göndermek soruya hiçbir şey katmaz. Cevabınızla ilgili yeni bir şey varsa, lütfen bunun nasıl farklı olduğunu ve bunun neden daha iyi olduğunu açıklamak için birkaç cümle alın.
MTCoster

4

Hepsini Küreselleşme ile bir araya getirmek ve haftanın ilk gününü yaptığımız görüşmenin bir parçası olarak belirtmek için izin vermek

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

Bu size haftanın ilk Pazar günü gece yarısı verir:

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

Bu, gece yarısında ilk Pazartesi günü verir:

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

2

c # ile bunu deneyin.Bu kod ile belirli bir haftanın hem ilk tarihini hem de son tarihini alabilirsiniz.

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

Birkaç denedim ama bir Pazartesi günü başlayan bir hafta ile sorunu çözmedi, bana bir Pazar günü önümüzdeki Pazartesi vermekle sonuçlanan. Bu yüzden biraz değiştirdim ve bu kod ile çalışma var:

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

Görünüşe göre 'önümüzdeki Pazartesi' sorunu kültüre bağlıdır (ayrıca Eric'in cevabına ve Cerveser'ın yorumuna da bakınız.) Ancak, pazar günlerini dikkate almanız gerekmiyorsa (normal iş randevularında olduğu gibi) formülünüz basitleştirildi:dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Damian Vogel

2

Adım 1: Statik bir sınıf oluşturma

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

Adım 2: Haftanın hem başlangıç ​​hem de bitiş gününü almak için bu sınıfı kullanın

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

Hafta sonu (6 - (dt.DayOfWeek - startOfWeek)) % 7yazdığım birim sınavlara karşı benim için gerekli .
mlhDev

1

Aşağıdaki yöntem, istediğiniz DateTime döndürmelidir. Pazar gününün haftanın ilk günü olması için doğru, Pazartesi için yanlış:

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

Örnekler için teşekkürler. Her zaman "CurrentCulture" haftanın ilk günü kullanmak gerekiyordu ve bir dizi için tam Daynumber bilmek gerekiyordu .. işte benim ilk uzantıları:

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

Henüz kimse bunu doğru olarak cevaplamamış gibi görünüyor. Herkesin ihtiyaç duyması durumunda çözümümü buraya yapıştıracağım. Aşağıdaki kod, haftanın ilk gününün pazartesi veya pazar veya başka bir şey olup olmadığına bakılmaksızın çalışır.

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 # 'daki Modulo -1mod7 için kötü çalışıyor (6 olmalı, c # -1 döndürür) bu yüzden ... "oneliner" çözümü buna benzeyecek :)

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

1

Hafta sonu için aynı (@Compile Bu sorunun cevabı tarzında):

    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

Mükemmel Şemsiye kütüphanesini kullanabilirsiniz :

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

Ancak, do özelliği (bkz haftanın ilk günü olarak Pazartesi sakladığınız gibi görünüyornVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn önceki lokalize çözüm biraz daha iyi olduğunu böylece,). Talihsiz.

Düzenleme : soruya daha yakından bakıldığında, Şemsiye aslında bunun için de işe yarayabilir:

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

Her ne kadar önceki Pazartesi günü Pazartesi günü sorarsanız, size yedi gün geri vereceğini belirtmek gerekir. Ancak bu BeginningOfWeekbir hata gibi görünüyorsa da geçerlidir :(.


0

Bu, hem haftanın başlangıcı hem de haftanın sonu tarihlerini döndürür:

    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 bloguma hafta, ay, çeyrek ve yılın başlangıç ​​/ bitişini hesaplamak için tam kodu gönderdim


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

Yanıtınızı kodunuzun bir açıklamasını içerecek şekilde genişletebilir misiniz? Okuyucuya düşündüğünüzden daha fazla yardımcı olur.
gunr2171

Özyineleme kullanmak çok kötü bir uygulamadır. Özyinelemeleri kullanabilmeniz gerektiği anlamına gelmez. Burada sağlanan diğer çözümlere göre daha yavaş ve bellek yoğun olacaktır.
mikecamimo

0

İşte birkaç cevaptan oluşan bir kombinasyon. Kültürün geçmesine izin veren bir uzatma yöntemi kullanır, biri geçmezse, mevcut kültür kullanılır. Bu, ona maksimum esneklik ve yeniden kullanım sağlayacaktır.

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

Örnek Kullanım:

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

cumartesi veya pazar ya da haftanın herhangi bir gününü istiyor ancak mevcut haftayı (Sat-Sun) geçmiyorsanız, bu kod parçasını size aldım.

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

Tek satırları seviyoruz: Mevcut kültürün haftanın ilk günü ile şu anki gün arasındaki farkı elde edin, ardından geçerli günden gün sayısını çıkarın

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

0

Derleme Bu Yanıttan Sonra, haftanın herhangi bir günü için tarih almak üzere aşağıdaki yöntemi kullanın:

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

Özyineleme kullanan bir işlev oluşturmaya çalışın. DateTime nesneniz bir girdidir ve işlev, haftanın başında duran yeni bir DateTime nesnesi döndürür.

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

Bu kod soruyu çözebilir, ancak bunun sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olabilir ve muhtemelen daha fazla oyla sonuçlanır. Sadece şimdi soran kişi için değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın. Lütfen açıklama eklemek için yanıtınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin.
David Buck

0

Bu şekilde hesaplamak, haftanın hangi gününün yeni bir haftanın başlangıcını göstereceğini seçmenize olanak tanır (örnekte Pazartesi'yi seçtim).

Bu hesaplamayı Pazartesi günü yapmak için bir önceki günü değil, geçerli Pazartesi günü yapacağınızı unutmayın.

//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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.