किसी दिए गए DateTime ऑब्जेक्ट का उपयोग करके, महीने के पहले और अंतिम दिन प्राप्त करना


196

मैं उस महीने का पहला दिन और आखिरी दिन प्राप्त करना चाहता हूं, जहां एक दी गई तारीख निहित है। दिनांक एक UI फ़ील्ड में मान से आती है।

अगर मैं टाइम पिकर का उपयोग कर रहा हूं तो मैं कह सकता हूं

var maxDay = dtpAttendance.MaxDate.Day;

लेकिन मैं इसे डेटाइम ऑब्जेक्ट से प्राप्त करने की कोशिश कर रहा हूं। तो अगर मेरे पास यह है ...

DateTime dt = DateTime.today;

महीने का पहला दिन और आखिरी दिन कैसे प्राप्त करें dt?


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

यह कम हो रहा है क्योंकि लोग सोच रहे हैं कि आप ऐसा क्यों करना चाहते हैं और आप इस तरह की चीज का इस्तेमाल कहां करेंगे। आप हमें यहां अपने शुरुआती अंक के बारे में कुछ नहीं बता रहे हैं
मो पटेल

यह पूछना बेहतर है कि आप क्या करना चाहते हैं? ऐसा नहीं है कि आप कैसे करना चाहते हैं? अन्य उपयोग आपको सही सुझाव दे सकते हैं।
शैल

2
@Chathuranga u जानती हैं कि किसी भी महीने की न्यूनतम तारीख क्या होगी .... लेकिन सवाल यह है कि वर्तमान महीने की आखिरी तारीख क्या है .. u आप इस तरह से प्राप्त कर सकते हैं .. वर्तमान तिथि में 1 महीना और उस से 1 दिन घटाएं तारीख .. अब u को चालू माह की अंतिम तारीख मिलेगी
शैल

जवाबों:


475

DateTimeसंरचना केवल एक मान संग्रहीत करती है, मूल्यों की श्रेणी नहीं। MinValueऔर MaxValueस्थिर क्षेत्र हैं, जो DateTimeसंरचना के उदाहरणों के लिए संभावित मूल्यों की श्रेणी रखते हैं । ये क्षेत्र स्थिर हैं और विशेष रूप से संबंधित नहीं हैं DateTime। वे DateTimeस्वयं टाइप करने के लिए संबंधित हैं ।

सुझाव पढ़ने: स्थिर (सी # संदर्भ)

अद्यतन: महीने की सीमा प्राप्त करना:

DateTime date = ...
var firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);

16
मुझे पता है कि मैं यहाँ picky जा रहा हूँ, लेकिन ऐसा नहीं lastDayofMonthहोना चाहिए firstDayOfMonth.AddMonths(1).AddSeconds(-1);?
कार्ल गजर्टसन

36
@KarlGjertsen आप पर्याप्त रूप से योग्य नहीं हैं :) सही समाधान होगा AddTicks(-1), लेकिन अगर हम समय के बारे में परवाह नहीं करते हैं और केवल तारीख वाले भाग के बारे में सोचते हैं, तो दिन ठीक काम करते हैं
सर्गेई बेरेज़ोवस्की

7
अब यह picky किया जा रहा है! ;-) सवाल यह नहीं कहता है कि मूल्यों का उपयोग कैसे किया जा रहा है, इसलिए मैं रक्षात्मक रूप से कोड करता हूं।
कार्ल गजर्टसन

@SergeyBerezovskiy मैं इस बिंदु को बढ़ाने के लिए नफरत करता हूँ, लेकिन क्या आप समयक्षेत्र की जानकारी नहीं खोते हैं जब आप इस तरह से एक डेटाइम को नया करते हैं? जब भी आप इस तरह से एक नया उदाहरण बनाते हैं, तो जो कुछ भी टाइमज़ोन जानकारी मूल DateTime इंस्टेंस से जुड़ी होती है, वह खो जाती है।
मार्को

2
@ कर्लजर्त्सेन, आप पिकी को देखना चाहते हैं ... मैं व्यक्तिगत रूप से करता हूं < firstDayOfNextMonth इसके बजाय<= lastDayOfMonth । इस तरह यह हमेशा की परवाह किए बिना काम करेगा। (मुझे यकीन है कि टिक ठीक होगा, लेकिन कौन जानता है कि भविष्य क्या लाता है ... नैनोटिक्स?)
adam0101

99

यह @Sergey और @ Steffen के उत्तरों पर एक लंबी टिप्पणी है। अतीत में खुद इसी तरह का कोड लिखने के बाद मैंने यह जांचने का फैसला किया कि उस स्पष्टता को याद करते हुए सबसे अधिक प्रदर्शन करने वाला क्या है।

परिणाम

10 मिलियन पुनरावृत्तियों के लिए एक उदाहरण परीक्षण रन परिणाम है:

2257 ms for FirstDayOfMonth_AddMethod()
2406 ms for FirstDayOfMonth_NewMethod()
6342 ms for LastDayOfMonth_AddMethod()
4037 ms for LastDayOfMonth_AddMethodWithDaysInMonth()
4160 ms for LastDayOfMonth_NewMethod()
4212 ms for LastDayOfMonth_NewMethodWithReuseOfExtMethod()
2491 ms for LastDayOfMonth_SpecialCase()

कोड

संकलक अनुकूलन चालू होने के साथ परीक्षणों को चलाने के लिए मैंने लिनक्यूपैड 4 (सी # प्रोग्राम मोड में) का उपयोग किया। यहाँ स्पष्टता और सुविधा के लिए विस्तार विधियों के रूप में परीक्षित कोड दिया गया है:

public static class DateTimeDayOfMonthExtensions
{
    public static DateTime FirstDayOfMonth_AddMethod(this DateTime value)
    {
        return value.Date.AddDays(1 - value.Day);
    }

    public static DateTime FirstDayOfMonth_NewMethod(this DateTime value)
    {
        return new DateTime(value.Year, value.Month, 1);
    }

    public static DateTime LastDayOfMonth_AddMethod(this DateTime value)
    {
        return value.FirstDayOfMonth_AddMethod().AddMonths(1).AddDays(-1);
    }

    public static DateTime LastDayOfMonth_AddMethodWithDaysInMonth(this DateTime value)
    {
        return value.Date.AddDays(DateTime.DaysInMonth(value.Year, value.Month) - value.Day);
    }

    public static DateTime LastDayOfMonth_SpecialCase(this DateTime value)
    {
        return value.AddDays(DateTime.DaysInMonth(value.Year, value.Month) - 1);
    }

    public static int DaysInMonth(this DateTime value)
    {
        return DateTime.DaysInMonth(value.Year, value.Month);
    }

    public static DateTime LastDayOfMonth_NewMethod(this DateTime value)
    {
        return new DateTime(value.Year, value.Month, DateTime.DaysInMonth(value.Year, value.Month));
    }

    public static DateTime LastDayOfMonth_NewMethodWithReuseOfExtMethod(this DateTime value)
    {
        return new DateTime(value.Year, value.Month, value.DaysInMonth());
    }
}

void Main()
{
    Random rnd = new Random();
    DateTime[] sampleData = new DateTime[10000000];

    for(int i = 0; i < sampleData.Length; i++) {
        sampleData[i] = new DateTime(1970, 1, 1).AddDays(rnd.Next(0, 365 * 50));
    }

    GC.Collect();
    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
    for(int i = 0; i < sampleData.Length; i++) {
        DateTime test = sampleData[i].FirstDayOfMonth_AddMethod();
    }
    string.Format("{0} ms for FirstDayOfMonth_AddMethod()", sw.ElapsedMilliseconds).Dump();

    GC.Collect();
    sw.Restart();
    for(int i = 0; i < sampleData.Length; i++) {
        DateTime test = sampleData[i].FirstDayOfMonth_NewMethod();
    }
    string.Format("{0} ms for FirstDayOfMonth_NewMethod()", sw.ElapsedMilliseconds).Dump();

    GC.Collect();
    sw.Restart();
    for(int i = 0; i < sampleData.Length; i++) {
        DateTime test = sampleData[i].LastDayOfMonth_AddMethod();
    }
    string.Format("{0} ms for LastDayOfMonth_AddMethod()", sw.ElapsedMilliseconds).Dump();

    GC.Collect();
    sw.Restart();
    for(int i = 0; i < sampleData.Length; i++) {
        DateTime test = sampleData[i].LastDayOfMonth_AddMethodWithDaysInMonth();
    }
    string.Format("{0} ms for LastDayOfMonth_AddMethodWithDaysInMonth()", sw.ElapsedMilliseconds).Dump();

    GC.Collect();
    sw.Restart();
    for(int i = 0; i < sampleData.Length; i++) {
        DateTime test = sampleData[i].LastDayOfMonth_NewMethod();
    }
    string.Format("{0} ms for LastDayOfMonth_NewMethod()", sw.ElapsedMilliseconds).Dump();

    GC.Collect();
    sw.Restart();
    for(int i = 0; i < sampleData.Length; i++) {
        DateTime test = sampleData[i].LastDayOfMonth_NewMethodWithReuseOfExtMethod();
    }
    string.Format("{0} ms for LastDayOfMonth_NewMethodWithReuseOfExtMethod()", sw.ElapsedMilliseconds).Dump();

    for(int i = 0; i < sampleData.Length; i++) {
        sampleData[i] = sampleData[i].FirstDayOfMonth_AddMethod();
    }

    GC.Collect();
    sw.Restart();
    for(int i = 0; i < sampleData.Length; i++) {
        DateTime test = sampleData[i].LastDayOfMonth_SpecialCase();
    }
    string.Format("{0} ms for LastDayOfMonth_SpecialCase()", sw.ElapsedMilliseconds).Dump();

}

विश्लेषण

मैं इनमें से कुछ परिणामों से हैरान था।

हालाँकि इसमें बहुत कुछ नहीं है लेकिन टेस्ट के अधिकांश रनों की FirstDayOfMonth_AddMethodतुलना FirstDayOfMonth_NewMethodमें यह थोड़ा तेज़ था । हालांकि, मुझे लगता है कि उत्तरार्द्ध का थोड़ा स्पष्ट इरादा है और इसलिए मेरे पास इसके लिए एक प्राथमिकता है।

LastDayOfMonth_AddMethod के खिलाफ एक स्पष्ट हारे हुए था LastDayOfMonth_AddMethodWithDaysInMonth , LastDayOfMonth_NewMethodऔर LastDayOfMonth_NewMethodWithReuseOfExtMethod। सबसे तेज़ तीनों के बीच इसमें बहुत कुछ नहीं है और इसलिए यह आपकी व्यक्तिगत पसंद पर निर्भर करता है। मैं LastDayOfMonth_NewMethodWithReuseOfExtMethodएक और उपयोगी विस्तार विधि के पुन: उपयोग के साथ स्पष्टता का चयन करता हूं । IMHO का इरादा साफ है और मैं छोटे प्रदर्शन लागत को स्वीकार करने को तैयार हूं।

LastDayOfMonth_SpecialCase मान लें कि आप उस विशेष मामले में महीने का पहला प्रदान कर रहे हैं, जहाँ आप पहले से ही उस तिथि की गणना कर सकते हैं और यह ऐड मेथड का उपयोग करता है DateTime.DaysInMonth परिणाम प्राप्त करने के । यह अन्य संस्करणों की तुलना में तेज़ है, जैसा कि आप उम्मीद करेंगे, लेकिन जब तक आपको गति की सख्त ज़रूरत नहीं है, मुझे आपके शस्त्रागार में इस विशेष मामले के होने की बात दिखाई नहीं देती है।

निष्कर्ष

यहाँ मेरी पसंद के साथ और सामान्य समझौते में एक विस्तार विधि वर्ग है @Steffen के साथ मेरा मानना ​​है:

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

    public static int DaysInMonth(this DateTime value)
    {
        return DateTime.DaysInMonth(value.Year, value.Month);
    }

    public static DateTime LastDayOfMonth(this DateTime value)
    {
        return new DateTime(value.Year, value.Month, value.DaysInMonth());
    }
}

यदि आपको यह दूर मिला है, तो समय के लिए धन्यवाद! इसका मज़ा: been) है। यदि आपके पास इन एल्गोरिदम के लिए कोई अन्य सुझाव है तो कृपया टिप्पणी करें।


5
हालांकि आपके पास अपने प्रयास के लिए बहुत कम क्रेडिट है। येह काम का है!
डायोन वी।

2
धन्यवाद @DionV - सराहना की जानी अच्छी है! जब आप जल्दी में होते हैं तो छोटे उत्तर बहुत अच्छे होते हैं लेकिन मुझे लगता है कि पालन करने के लिए कुछ गहन विश्लेषण अक्सर उपयोगी होते हैं।
वूवेबॉच

आपने एक और विकल्प याद किया: LastDayOfMonth_AddMethod_SpecialCase(या ऐसा कुछ)। महीने के पहले दिन को पैरामीटर के रूप में उम्मीद करते हुए, मुझे लगता है कि सबसे तेज होना चाहिए क्या LastDayOfMonth_AddMethodकरता है! इतना आसान होगा:return value.AddMonths(1).AddDays(-1);
एंड्रयू

1
धन्यवाद @Andrew और यहाँ मेरा उपयोग कर रहे हैं कि परिणाम: 2835 एमएस के लिए LastDayOfMonth_SpecialCase (), और; LastDayOfMonth_AddMethod_SpecialCase () के लिए 4685 एमएस। जो संभवतः रचना के समय पर विचार करते समय समझ में आता है और यह कि डेटाइम का आंतरिक प्रतिनिधित्व संभवतः दिनों को एक सरल ऑपरेशन बनाता है, लेकिन महीनों को और अधिक जटिल एल्गोरिथ्म जोड़ देता है।
वुवाबाक

15

.Net API के साथ महीने की सीमा प्राप्त करना (बस दूसरा तरीका):

DateTime date = ...
var firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
var lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));

6

" Last day of month" वास्तव में " First day of *next* month, minus 1" है। तो यहाँ मैं क्या उपयोग करता हूँ, "DaysInMonth" विधि की कोई आवश्यकता नहीं है:

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

public static DateTime LastDayOfMonth(this DateTime value)
{
    return value.FirstDayOfMonth()
        .AddMonths(1)
        .AddMinutes(-1);
}

नोट: कारण, मैं यहां उपयोग करता हूं AddMinutes(-1), AddDays(-1)क्योंकि आमतौर पर आपको कुछ तिथि-अवधि के लिए रिपोर्टिंग के लिए इन कार्यों की आवश्यकता होती है, और जब आप किसी अवधि के लिए रिपोर्ट बनाते हैं, तो "अंतिम तिथि" वास्तव में कुछ होनी चाहिए।Oct 31 2015 23:59:59 ताकि आपकी रिपोर्ट सही ढंग से काम करे - महीने के अंतिम दिन से सभी डेटा सहित।

यानी आपको वास्तव में "अंतिम क्षण " मिलता है महीने का " यहां । अंतिम दिन नहीं।

ठीक है, मैं अब बंद करने जा रहा हूं।


5
DateTime dCalcDate = DateTime.Now;
dtpFromEffDate.Value = new DateTime(dCalcDate.Year, dCalcDate.Month, 1);
dptToEffDate.Value = new DateTime(dCalcDate.Year, dCalcDate.Month, DateTime.DaysInMonth(dCalcDate.Year, dCalcDate.Month));

आम तौर पर कोड-केवल उत्तरों से बचें। descriptionउस कोड को जोड़ने पर विचार करें जो आपके कोड को समझाने में मदद करता है। धन्यवाद
मिक्य डी

3

यहां आप चालू माह के पहले दिन के लिए एक महीने जोड़ सकते हैं, उस दिन से 1 दिन हटा सकते हैं।

DateTime now = DateTime.Now;
var startDate = new DateTime(now.Year, now.Month, 1);
var endDate = startDate.AddMonths(1).AddDays(-1);

2

यदि आप केवल तारीख की परवाह करते हैं

var firstDay = new DateTime(date.Year, date.Month, 1, 0, 0, 0, date.Kind);
var lastDay = new DateTime(date.Year, date.Month, 1, 0, 0, 0, date.Kind).AddMonths(1).AddDays(-1);

यदि आप समय को संरक्षित करना चाहते हैं

var firstDay = new DateTime(date.Year, date.Month, 1, date.Hour, date.Minute, date.Second, date.Kind);
var lastDay = new DateTime(date.Year, date.Month, 1, date.Hour, date.Minute, date.Second, date.Kind).AddMonths(1).AddDays(-1);

यह पूरी तरह से ड्यूड ड्यूडीई में विफल रहा है। यह महीने "13" के साथ डेटाइम बनाने की कोशिश करेगा और अपवाद को फेंक देगा कि ऐसी कोई तारीख नहीं है।
पावेल

कब से 13 दिसंबर है? कुल 12 महीने हैं। आप किस कैलेंडर का उपयोग करते हैं?
विटाली

यदि आपकी तारीख ख़राब है तो यह एक महीने जोड़ने की कोशिश करेगा जिसके परिणामस्वरूप अपवाद होगा। नया दिनांक समय (दिनांक। वर्ष, 12+ 1, 1, 0, 0, दिनांक, किंड)। संशोधन (-1); एक दिन से इसे हटाने का काम डेटटाइम के बाद बनाया जाएगा, इसलिए इसे डेली के लिए महीने की तारीख "13" की कोशिश में विफल कर दिया जाएगा। आप इसे आज़मा सकते हैं।
पावेल

1

यहाँ स्वीकार किए गए उत्तर का अर्थ डेटाइम टाइम की स्थिति को ध्यान में नहीं रखा गया है। उदाहरण के लिए यदि आपका मूल दिनांक समय उदाहरण UTC Kind था, तो एक नया DateTime उदाहरण बनाकर आप एक अज्ञात प्रकार का उदाहरण बना देंगे जिसे तब सर्वर सेटिंग्स के आधार पर स्थानीय समय माना जाएगा। इसलिए महीने की पहली और आखिरी तारीख पाने का अधिक उचित तरीका यह होगा:

var now = DateTime.UtcNow;
var first = now.Date.AddDays(-(now.Date.Day - 1));
var last = first.AddMonths(1).AddTicks(-1);

इस तरह से डेटाइम इंस्टेंस का मूल प्रकार संरक्षित है।


1

इसको आजमाओ:

string strDate = DateTime.Now.ToString("MM/01/yyyy");

1

मैंने इसे अपनी स्क्रिप्ट में इस्तेमाल किया (मेरे लिए काम करता है) लेकिन मुझे इसे पूरी तरह से ट्रिम करने की आवश्यकता के बिना केवल तारीख और समय की आवश्यकता थी।

public DateTime GetLastDayOfTheMonth()
{
    int daysFromNow = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month) - (int)DateTime.Now.Day;
    return DateTime.Now.AddDays(daysFromNow);
}

1

इसे आजमाइए। यह मूल रूप से उन दिनों की संख्या की गणना करता है जो बीत चुके हैं DateTime.Now, फिर उसमें से एक घटाते हैं और वर्तमान महीने के पहले को खोजने के लिए नए मूल्य का उपयोग करते हैं। वहां से वह इसका उपयोग करता है DateTimeऔर उपयोग करता है.AddMonths(-1) पिछले महीने का पहला पाने के लिए है।

पिछले महीने के आखिरी दिन को प्राप्त करना मूल रूप से एक ही काम करता है, सिवाय इसके कि महीने में एक दिन की संख्या को जोड़ा जाए और पिछले महीने के आखिरी दिन से आपको उस मूल्य को घटाया जाएDateTime.Now.AddDays

int NumberofDays = DateTime.Now.Day;
int FirstDay = NumberofDays - 1;
int LastDay = NumberofDays + 1;
DateTime FirstofThisMonth = DateTime.Now.AddDays(-FirstDay);
DateTime LastDayOfLastMonth = DateTime.Now.AddDays(-LastDay);
DateTime CheckLastMonth = FirstofThisMonth.AddMonths(-1);

0

फारसी संस्कृति के लिए

PersianCalendar pc = new PersianCalendar();            

var today = pc.GetDayOfMonth(DateTime.Now);
var firstDayOfMonth = pc.GetDayOfMonth(DateTime.Now.AddDays(-(today-1)));
var lastDayOfMonth = pc.GetDayOfMonth(DateTime.Now.AddMonths(1).AddDays(-today));            
Console.WriteLine("First day "+ firstDayOfMonth);
Console.WriteLine("Last day " + lastDayOfMonth);

0

तुम कर सकते हो

DateTime dt = DateTime.Now; 
DateTime firstDayOfMonth = new DateTime(dt.Year, date.Month, 1);
DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);

-1

इसे करने का आसान तरीका

Begin = new DateTime(DateTime.Now.Year, DateTime.Now.Month,1).ToShortDateString();
End = new DataFim.Text = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month)).ToShortDateString();

यह कोड "नए DataFim.Text" के कारण संकलन नहीं करता है।
वेजनर

-1
DateTime dCalcDate = DateTime.Now;
var startDate = new DateTime(Convert.ToInt32(Year), Convert.ToInt32(Month), 1);
var endDate = new DateTime(Convert.ToInt32(Year), Convert.ToInt32(Month), DateTime.DaysInMonth((Convert.ToInt32(Year)), Convert.ToInt32(Month)));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.