मैं सप्ताह की शुरुआत के लिए डेटटाइम कैसे प्राप्त कर सकता हूं?


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
ट्रॉय, मुझे विश्वास नहीं है कि आपका कोड काम करता है अगर दी गई तारीख एक रविवार है और आपका सप्ताह का सोमवार है। यह (रविवार + 1) के बजाय (रविवार - 6)
आरोन हॉफमैन

1
यह काम नहीं करता है यदि dtUTC है और पहले से ही सप्ताह की शुरुआत है जैसे 2012-09-02 16:00:00Zकि Mon, 03 Sep 2012 00:00:00स्थानीय समय में। इसलिए इसे dtस्थानीय समय में बदलने की जरूरत है या फिर कुछ अधिक समझदारी से काम लेना चाहिए। यदि इनपुट यूटीसी था, तो उसे यूटीसी के रूप में परिणाम वापस करना भी होगा।
row1

1
@ row1 DateTime.Parse("2012-09-02 16:00:00Z")स्थानीय-समय के बराबर देता है, और यह विधि स्थानीय समय के अनुसार सही समय पर वापस आती है। यदि आप DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()यूटीसी समय को स्पष्ट रूप से पास करने के लिए उपयोग करते हैं , तो यह विधि सही तरीके से यूटीसी समय के रूप में 6 दिन, 16 घंटे पहले लौटती है। यह बिल्कुल वैसा ही काम कर रहा है जैसा मुझे उम्मीद थी।
13:51

1
यह कभी-कभी मेरे लिए एक दिन बंद हो जाता। एक बार मैंने समय घटक को छीन लिया तो यह मेरे लिए काम कर गया dt। मैंने इस्तेमाल कियाint diff = dt.Date.DayOfWeek - startOfWeek;
विंसेंट सेल्ज़लर

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
सबसे सरल जवाब सबसे अच्छा है, यह एक ठीक काम किया है, लेकिन संस्कृति पर निर्भर करता है
Cerveser

7
लातविया सप्ताह में सोमवार से शुरू होता है .. वास्तव में .. मुझे हमेशा आश्चर्य होता है कि रविवार को एक सप्ताह कैसे शुरू हो सकता है .. मुझे अजीब लगता है ..?)
0xDEAD BEEF

यह समाधान अच्छा है। इसके अलावा आप जिस दिन की शुरुआत करना चाहते हैं उसी दिन को जोड़कर सप्ताह की शुरुआत किसी भी दिन कर सकते हैं। var sunday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek); var monday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek + (int) DayOfWeek.Monday);
लोलिगन्स

7
यह जोड़ा गया कोड थ्रीज़ोल द्वारा वर्णित स्थिति के लिए काम नहीं करता है। यदि आप चाहते हैं कि सप्ताह की शुरुआत सोमवार हो, रविवार को गणना आपको आने वाले सोमवार को देती है, तो पिछले को नहीं।
जियोवानी बी

4
हाँ .. रविवार के लिए, यह अगला मोदन देता है .. पिछले नहीं: पी
अजय अराध्या

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; 01-02-2010! = 25-01-2010 !!
balexandre

3
यदि आप रविवार को यह कोशिश करते हैं, तो यह मूल रूप से एन-जीबी के लिए AddDays (0 - 1) कर रहा है। तो यह @ Sarcastic के बयान की जरूरत है
क्रिस एस

3
आप वर्तमान संस्कृति का उपयोग CultureInfo.CurrentCultureउस धागे की तरह उतारने के बजाय कर सकते हैं । इसे उपयोग करने के लिए एक अजीब तरह से लगता है।
हांक

7
एक और मुद्दा: Nowसंपत्ति को दो बार कॉल करना खतरनाक है । यदि दो कॉलों के बीच वर्तमान समय 24:00 (या 12:00 मध्यरात्रि) बीत जाता है, तो तिथि बदल जाएगी।
जेपी स्टिग नील्सन

1
यह उत्तर वास्तव में क्या करता है: "चालू .NET सप्ताह के अंदर (रविवार को शुरू होता है और शनिवार को समाप्त होता है, DayOfWeek गणन की संख्या के अनुसार), .NET सप्ताह का दिन ढूंढें जो सप्ताह का पहला है वर्तमान संस्कृति में "। यह शायद वह नहीं है जो आप चाहते हैं।
मथिउ रेंडा

36

धाराप्रवाह DateTime का उपयोग :

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

29
मैं सिर्फ इस के लिए एक निर्भरता पर लेने के लिए नफरत करता हूँ। "अपनी निर्भरताओं को जानें और उन्हें मार दें" मन में आने लगता है। :)
एस्टेबन अरया

7
क्या किसी ने देखा कि "धाराप्रवाह" कैसे काम कर रहा है? बस कोड पर एक नज़र रखना। यह एक का उपयोग कर रहा है ... जबकि पाश। इसे नाम नहीं बताना चाहते हैं, लेकिन अगर मैं यह करने का फैसला करता हूं तो यह सुखद नहीं होगा। public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
nsimeonov

10
@nsimeonov यह खुला स्रोत है। कृपया एक बेहतर कार्यान्वयन प्रदान करने के लिए स्वतंत्र महसूस करें, बल्कि फिर पत्थर फेंकें।
सिमोन

12
हाँ, जैसे कि मेरे पास दुनिया का हर समय हर ओपन सोर्स सॉफ्टवेयर में हर एक बग को ठीक करने के लिए ...
nsimeonov

4
मुझे टिप्पणी करनी पड़ी क्योंकि मुझे "डू ... जबकि" लूप का उपयोग करने के बारे में शिकायत से बहुत हंसी आई! प्रफुल्लित! मैंने पहले एक लूप के बारे में एक और प्रोग्रामर कंपकंपी नहीं सुनी है। इस मसख़रे का चेहरा देखना पसंद करेंगे जब / यदि उसे कभी पता चलता है कि उसका कोड वास्तव में क्या संकलन करता है।
जोश स्टोडोला

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
यह वास्तव में अपनी सादगी और पठनीयता के लिए अधिक वोटों का हकदार है।
प्रोफक डे

इस संसाधन ने भी मदद की: markb.uk/… (यदि आप सप्ताह या महीने का पहला / अंतिम दिन प्राप्त करना चाहते हैं)।
फ्रांजहुबर 23

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
न डीटी और न ही startOfWeek अपने समारोह के भीतर प्रयोग किया जाता है, मुझे लगता है पहले एक के बजाय DateTime.Today इस्तेमाल किया जाना चाहिए
hultqvist

2
प्रश्न के संदर्भ में डेटाइम का उपयोग करने के लिए एक अतिरिक्त संपत्ति चाह रहा है जैसे .टोडे या .अब। मैं मानता हूं कि यह अजीब है, लेकिन यह वही है जो पूछा गया था।
जोएल कोएहॉर्न

7
मुझे पता है कि यह एक पुराना उत्तर है, लेकिन यह इतने सारे स्तरों पर गलत है; विधि के तर्कों को पूरी तरह से अनदेखा करने के अलावा, गणित कई मामलों में भविष्य की तारीख चुनने का कारण होगा । यह एक नकारात्मक पैरामीटर सुनिश्चित करने के लिए, एक एकल-पैरामीटर विधि अधिभारdt का उपयोग करने के DateTime.Todayलिए गणित को लपेटने के बजाय का उपयोग करने के लिए लिखा जाना चाहिए था , जो वर्तमान संस्कृति को तर्क के रूप में पारित करता है, और संभवतः (कल्पना के आधार पर) एक जोर देने के लिए शून्य से 7-दिन की ऑफ़सेट होती है, जिससे कि "पिछले मंगलवार" की वापसी नहीं होती है अगर यह पहले से ही मंगलवार है। (offset + 7) % 7FirstDayOfWeekstartOfWeek
Aaronaught

10

यह आपको पूर्ववर्ती रविवार देगा (मुझे लगता है):

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

9

यह एक हैक का एक सा हो सकता है, लेकिन आप एक .DayOfWeek प्रॉपर्टी को इंट में डाल सकते हैं (यह एक एनम है और चूंकि इसके अंतर्निहित डेटा प्रकार ने इसे डिफ़ॉल्ट में नहीं बदला है) और सप्ताह की पिछली शुरुआत निर्धारित करने के लिए इसका उपयोग करने के लिए ।

ऐसा लगता है कि DayOfWeek enum में निर्दिष्ट सप्ताह रविवार से शुरू होता है, इसलिए यदि हम 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
मुझे एक अलग एप्लिकेशन की आवश्यकता थी, हालांकि मुझे जाने के लिए मैंने इसका इस्तेमाल किया। मुझे यह पसंद है क्योंकि यह सबसे सरल है, बिना किसी कास्टिंग के - समान / उपयुक्त प्रकार में संचालन को बनाए रखना।
15

1
यह तब काम नहीं करता जब दिन रविवार होता है। यह निम्नलिखित सोमवार देता है, वर्तमान सप्ताह की शुरुआत नहीं।
जे

साथ ही आपने संडे या मंडे को कॉपी किया। मेरे पास 2 उत्तर हैं यदि आप सोमवार के लिए चाहते हैं और 2on यदि आप रविवार के लिए चाहते हैं तो ..... मैंने अभी इसका परीक्षण किया है और यह मेरे लिए ठीक है। DateTime.Now.DayOfWeek; रविवार और परिणाम DateTime.Now.AddDays (DayOfWeek.Sunday - DateTime.Now.DayOfWeek); {10/11/2019 4:14:55 μμ} दिनांक: {10/11/2019 12:00:00 }μ} दिन: 10 दिनऑफीक: रविवार का दिन: 314 घंटा: 16 प्रकार: 16 प्रकार: स्थानीय मिलिसकॉन्ड: 17 महीने: 14 महीने : 11 दूसरा: 55 टिक्स: 637089992951723516 टाइमऑफडे: {16: 14: 55.1723516} वर्ष: 2019
जॉर्ज

@GranJ आपने क्या लाइन ली ??? मैंने अभी परीक्षण किया है और यह ठीक काम करता है।
जॉर्ज स्टाव्रू

मैंने पहले तारीख की कोशिश की, अपने DateTime.Now को प्रतिस्थापित करते हुए। दिनांक 10 नवंबर 2019 रविवार का प्रतिनिधित्व करने वाले DateTime के साथ। यह सोमवार 4 नवंबर 2019 को देना चाहिए, लेकिन यह सोमवार 11 नवंबर 2019 को देता है। मैंने यहां एक फिडेल का
J 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
सबसे पहले, समुदाय में आपका स्वागत है :) इस सवाल के पहले से ही कई उच्च गुणवत्ता के उत्तर हैं, जिनमें से अधिकांश सात साल पहले पोस्ट किए गए थे जब सवाल पूछा गया था। हालांकि, यह आपकी प्रोग्रामिंग क्षमताओं को आगे बढ़ाने के लिए इस तरह के एक के रूप में सरल सवालों के जवाब देने का प्रयास करने के लिए एक सार्थक अभ्यास हो सकता है, इस उत्तर को अपनी वर्तमान स्थिति में पोस्ट करने से सवाल कुछ भी नहीं जोड़ता है। यदि आपके उत्तर के बारे में कुछ उपन्यास है, तो कृपया यह बताने के लिए कुछ वाक्य लें कि यह कैसे अलग है और क्यों यह बेहतर बनाता है।
MTCoster 18

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;

}


2

इससे आपको सप्ताह के पहले रविवार को आधी रात मिलेगी:

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

यह आपको आधी रात को पहला सोमवार देता है:

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

कई कोशिश की लेकिन सोमवार से शुरू होने वाले एक सप्ताह के साथ इस मुद्दे को हल नहीं किया, जिसके परिणामस्वरूप मुझे रविवार को आने वाला सोमवार दिया गया। इसलिए मैंने इसे थोड़ा संशोधित किया और इसे इस कोड के साथ काम करने लगा:

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

ऐसा लगता है कि 'आने वाले सोमवार' की समस्या संस्कृति पर निर्भर है (एरिक से जवाब और Cerveser की टिप्पणी भी देखें।) हालांकि, यदि आपको रविवार को ध्यान में रखने की आवश्यकता नहीं है (सामान्य व्यावसायिक नियुक्तियों के साथ) तो आपका सूत्र हो सकता है। सरलीकृत:dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
डेमियन वोगेल

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

Step2: सप्ताह के शुरू और अंत दोनों दिन पाने के लिए इस वर्ग का उपयोग करें

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

(6 - (dt.DayOfWeek - startOfWeek)) % 7मेरे द्वारा लिखे गए यूनिट परीक्षणों के लिए सप्ताह का अंत आवश्यक है ।
मिलीलीटरदेव

1

निम्न विधि आप चाहते हैं कि DateTime को वापस करना चाहिए। सप्ताह के पहले दिन रविवार होने के लिए सही, सोमवार के लिए गलत:

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

उदाहरण के लिए धन्यवाद। मुझे हमेशा सप्ताह के पहले दिन "करंटकल्चर" का उपयोग करने की आवश्यकता थी और एक सरणी के लिए मुझे सटीक डेटनंबर को जानने की आवश्यकता थी .. इसलिए यहां मेरे पहले एक्सटेंशन हैं:

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

Modulo in C # -1mod7 के लिए खराब काम करता है (6 होना चाहिए, c # रिटर्न -1) इसलिए ... "oneliner" का समाधान इस तरह दिखेगा :)

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

1

सप्ताह के अंत के लिए भी (@ कॉम के इस उत्तर की शैली में):

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

हालांकि यह ध्यान देने योग्य है कि यदि आप पिछले सोमवार को सोमवार के लिए पूछते हैं, तो यह आपको सात दिन पहले देगा। लेकिन यह भी सच है अगर आप उपयोग करते हैं 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();
            }
        }
    } 

क्या आप अपने कोड का स्पष्टीकरण शामिल करने के लिए अपने उत्तर का विस्तार कर सकते हैं? यह पाठक को आपकी सोच से अधिक मदद करता है।
गन्र

पुनरावृत्ति का उपयोग करना बहुत खराब कार्यान्वयन है। सिर्फ इसलिए कि आप recursions का उपयोग कर सकते हैं इसका मतलब यह नहीं है कि आपको चाहिए। यह यहां उपलब्ध अन्य समाधानों की तुलना में धीमा और अधिक गहन होगा।
mikecamimo

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

संकलन 'इस उत्तर से, सप्ताह के किसी भी दिन की तारीख प्राप्त करने के लिए निम्नलिखित विधि का उपयोग करें:

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

हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और संभवत: अधिक वोट मिले। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
डेविड बक

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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.