दो तिथियों के बीच महीनों में अंतर


334

C # में दो तिथियों के बीच महीनों में अंतर की गणना कैसे करें?

क्या DateDiff()C # में VB की विधि के बराबर है । मुझे दो तिथियों के बीच के महीनों में अंतर खोजने की आवश्यकता है जो वर्ष अलग हैं। प्रलेखन कहता है कि मैं TimeSpanजैसे उपयोग कर सकता हूं :

TimeSpan ts = date1 - date2;

लेकिन यह मुझे डेज में डेटा देता है। मैं इस संख्या को 30 से विभाजित नहीं करना चाहता, क्योंकि हर महीने 30 दिन नहीं है और चूंकि दो ऑपरेंड मान एक दूसरे से काफी अलग हैं, इसलिए मुझे डर है कि 30 से विभाजित करने से मुझे गलत मूल्य मिल सकता है।

कोई सुझाव?


27
"महीनों में अंतर" को परिभाषित करें, "मई 1,2010" और "जून 16,2010" के बीच के महीनों में क्या अंतर है? 1.5, 1 या कुछ और?
चेंग चेन

7
या, इस बिंदु को और आगे बढ़ाने के लिए, 31 दिसंबर 2010 और 1 जनवरी 2011 के बीच के महीनों में क्या अंतर है? दिन के आधार पर यह केवल 1 सेकंड का अंतर हो सकता है; क्या आप इसे एक महीने के अंतर के रूप में गिनेंगे?
stakx - अब

इस मामले में सरल और संक्षिप्त कोड है, आप अभी भी इसका जवाब नहीं पा सके हैं, इस POST stackoverflow.com/questions/8820603/… पर
wirol

11
डैनी: 1 महीने और 15 दिन। stakx: 0 महीने और 1 दिन। महीने के घटक को प्राप्त करने के लिए बिंदु है । यह मुझे बहुत स्पष्ट लगता है और एक अच्छा सवाल है।
कर्क वॉक

जवाबों:


462

मान लें कि महीने का दिन अप्रासंगिक है (यानी 2011.1.1 और 2010.12.31 के बीच का अंतर 1 है), तारीख 1 के साथ> तारीख 2 एक सकारात्मक मूल्य देता है और तारीख 2> तारीख 1 एक नकारात्मक मूल्य है

((date1.Year - date2.Year) * 12) + date1.Month - date2.Month

या, मान लें कि आप दो तारीखों के बीच 'औसत महीनों' की अनुमानित संख्या चाहते हैं, तो निम्नलिखित सभी के लिए काम करना चाहिए, लेकिन बहुत बड़ी तारीख का अंतर।

date1.Subtract(date2).Days / (365.25 / 12)

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


अद्यतन ( गैरी के लिए धन्यवाद )

यदि 'औसत महीने' की विधि का उपयोग करते हैं, तो 'औसत प्रति दिन दिनों की औसत संख्या' का उपयोग करने के लिए थोड़ा अधिक सटीक संख्या 365.2425 है


3
@ कुरु - ३६५ / १२ केवल दिनों में एक महीने की औसत लंबाई का एक अनुमानित माप है। यह एक गलत उपाय है। छोटी तिथि सीमा के लिए यह अशुद्धि सहन की जा सकती है लेकिन बहुत बड़ी तिथि सीमा के लिए यह अशुद्धि महत्वपूर्ण हो सकती है।
एडम राल्फ

21
मुझे लगता है कि दिन के घटक पर विचार करना आवश्यक है। कुछ इस तरह (date1.Year - date2.Year) * 12 + date1.Month - date2.Month + (date1.Day >= date2.Day ? 0 : -1)
22

2
@DrunkCoder यह किसी दिए गए सिस्टम की आवश्यकताओं पर निर्भर करता है। कुछ मामलों में आपका समाधान वास्तव में सबसे अच्छा विकल्प हो सकता है। उदाहरण के लिए यह सोचना महत्वपूर्ण है कि क्या होता है जब दो तिथियां 31 दिन का महीना, 30 दिन का महीना, 28 फरवरी का दिन या 29 फरवरी का दिन होता है। यदि आपके सूत्र के परिणाम वितरित करते हैं कि सिस्टम को क्या आवश्यकता है तो यह स्पष्ट रूप से सही विकल्प है। यदि नहीं, तो कुछ और आवश्यक है।
एडम राल्फ

6
दूसरा यह कि एडम ने क्या कहा, मैंने वर्षों तक अभिनेताओं के लिए कोड लिखने में बिताया। कुछ गणना मासिक संख्या प्राप्त करने के लिए, दिनों की संख्या से विभाजित होती हैं, 30 से गोल होती हैं । कभी-कभी गिनने वाले महीनों को माना जाता है कि हर महीने महीने की पहली तारीख से शुरू होता है, उसी के अनुसार पूरे महीने गिनें । जब तारीखों की गणना करने की बात आती है तो कोई सबसे अच्छा तरीका नहीं है। जब तक आप ग्राहक नहीं हैं, जिसके लिए आप कोड लिख रहे हैं, इस श्रृंखला को आगे बढ़ाएं और इसे स्पष्ट करें, संभवतः आपके द्वारा ग्राहक लेखाकार।
बाइनरी वॉरियर

1
ग्रेगोरियन कैलेंडर में 365.2425 दिनों की तुलना में थोड़ा अधिक सटीक है, यदि आप इसका उपयोग कर रहे हैं। हालाँकि, DateTime.MaxValue (1 जनवरी, 10000) से केवल 59 दिनों का अंतर है। इसके अलावा, एक वर्ष की परिभाषा आपके दृष्टिकोण en.wikipedia.org/wiki/Year के आधार पर बहुत भिन्न हो सकती है ।
गैरी

207

यहाँ एक व्यापक समाधान है DateTimeSpan, ए के समान TimeSpan, सिवाय इसके कि इसमें समय घटकों के अतिरिक्त सभी दिनांक घटक शामिल हैं।

उपयोग:

void Main()
{
    DateTime compareTo = DateTime.Parse("8/13/2010 8:33:21 AM");
    DateTime now = DateTime.Parse("2/9/2012 10:10:11 AM");
    var dateSpan = DateTimeSpan.CompareDates(compareTo, now);
    Console.WriteLine("Years: " + dateSpan.Years);
    Console.WriteLine("Months: " + dateSpan.Months);
    Console.WriteLine("Days: " + dateSpan.Days);
    Console.WriteLine("Hours: " + dateSpan.Hours);
    Console.WriteLine("Minutes: " + dateSpan.Minutes);
    Console.WriteLine("Seconds: " + dateSpan.Seconds);
    Console.WriteLine("Milliseconds: " + dateSpan.Milliseconds);
}

आउटपुट:

वर्ष: 1
महीने: 5
दिन: 27
घंटे: 1
मिनट: 36
सेकंड: 50
मिलिसेकंड: 0

सुविधा के लिए, मैंने तर्क को DateTimeSpanसंरचना में ढाला है, लेकिन आप CompareDatesजहां कहीं भी फिट दिखाई देते हैं, आप विधि को स्थानांतरित कर सकते हैं। यह भी ध्यान दें, इससे कोई फर्क नहीं पड़ता कि कौन सी तारीख दूसरे से पहले आती है।

public struct DateTimeSpan
{
    public int Years { get; }
    public int Months { get; }
    public int Days { get; }
    public int Hours { get; }
    public int Minutes { get; }
    public int Seconds { get; }
    public int Milliseconds { get; }

    public DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
    {
        Years = years;
        Months = months;
        Days = days;
        Hours = hours;
        Minutes = minutes;
        Seconds = seconds;
        Milliseconds = milliseconds;
    }

    enum Phase { Years, Months, Days, Done }

    public static DateTimeSpan CompareDates(DateTime date1, DateTime date2)
    {
        if (date2 < date1)
        {
            var sub = date1;
            date1 = date2;
            date2 = sub;
        }

        DateTime current = date1;
        int years = 0;
        int months = 0;
        int days = 0;

        Phase phase = Phase.Years;
        DateTimeSpan span = new DateTimeSpan();
        int officialDay = current.Day;

        while (phase != Phase.Done)
        {
            switch (phase)
            {
                case Phase.Years:
                    if (current.AddYears(years + 1) > date2)
                    {
                        phase = Phase.Months;
                        current = current.AddYears(years);
                    }
                    else
                    {
                        years++;
                    }
                    break;
                case Phase.Months:
                    if (current.AddMonths(months + 1) > date2)
                    {
                        phase = Phase.Days;
                        current = current.AddMonths(months);
                        if (current.Day < officialDay && officialDay <= DateTime.DaysInMonth(current.Year, current.Month))
                            current = current.AddDays(officialDay - current.Day);
                    }
                    else
                    {
                        months++;
                    }
                    break;
                case Phase.Days:
                    if (current.AddDays(days + 1) > date2)
                    {
                        current = current.AddDays(days);
                        var timespan = date2 - current;
                        span = new DateTimeSpan(years, months, days, timespan.Hours, timespan.Minutes, timespan.Seconds, timespan.Milliseconds);
                        phase = Phase.Done;
                    }
                    else
                    {
                        days++;
                    }
                    break;
            }
        }

        return span;
    }
}

2
@KirkWoll धन्यवाद। लेकिन ऐसा क्यों है कि DateTimeSpan 34इस तारीख के समय के अंतर के लिए दिन लौटाता है, वास्तव में यह 35 timeanddate.com/date/… है
Deeptechtons

@ डिक्टेकटन, अच्छी पकड़। कुछ मुद्दे थे जो आपने मेरे ध्यान में लाए हैं, दोनों की शुरुआत की तारीख के साथ करना है 31और तारीख "कम दिनों" महीनों से गुजरती है। मैंने तर्क को उल्टा कर दिया है (ताकि यह जल्दी से बाद में इसके विपरीत से चला जाए) और अब वर्तमान तिथि को संशोधित किए बिना महीनों को जमा करता है (और इस तरह कम दिनों के साथ-बीच के महीनों से गुजर रहा है) फिर भी पूरी तरह से निश्चित नहीं है कि आदर्श परिणाम क्या है तुलना करते समय किया जाना चाहिए 10/31/2012करने के लिए 11/30/2012। अभी रिजल्ट 1महीना है।
कर्क वॉक

@KirkWoll अद्यतन के लिए धन्यवाद, शायद मैं कुछ और मिल गया है मुझे कुछ परीक्षणों के बाद यह पुष्टि करने दें अच्छा काम :)
दीपचट्टनस

1
मैंने इसी तरह के प्रश्न का उत्तर stackoverflow.com/a/17537472/1737957 लिखा था, जिसने प्रस्तावित उत्तरों का परीक्षण किया (और पाया कि उनमें से अधिकांश काम नहीं करते हैं)। यह उत्तर उन कुछ में से एक है जो काम करता है (मेरे परीक्षण सूट के अनुसार)। मेरे उत्तर पर गीथब से लिंक करें
jwg

@KirkWoll - यह उत्तर किनारे के मामलों के लिए काम नहीं करता है, जहां तारीख से तारीख के महीने की तुलना में एक दिन का मूल्य अधिक है या जहां स्रोत की तारीख एक लीप दिन है। कोशिश 2020-02-29करें 2021-06-29- यह "1y 4m 1d" लौटाता है, लेकिन मान "1y 4m 0d" होना चाहिए, है ना?
एनगैमेटिविटी

37

तुम यह कर सकते थे

if ( date1.AddMonths(x) > date2 )

यह बहुत सरल है और मेरे लिए एकदम सही काम करता है। मुझे यह देखकर सुखद आश्चर्य हुआ कि यह उस दिन के अनुसार काम करता है जब 1 महीने के अंत से लेकर अगले महीने के अंत तक की तारीख की गणना होती है जिसमें कम दिन होते हैं। उदाहरण के लिए .. 2018/01/31 + 1 महीने = 28 फ़र, 218
lucky.expert

यह बेहतर समाधानों में से एक है।
बरनाला

वास्तव में सरल और कुशल समाधान! सबसे अच्छा जवाब प्रस्तावित।
सेड्रिक अर्नोल्ड

2
क्या होगा अगर तारीख 1 = 2018-10-28 और तारीख 2 = 2018-12-21? उत्तर होगा 2. जबकि सही उत्तर होना चाहिए 3. क्योंकि तिथि सीमा 3 महीने की है। यदि हम केवल दिनों की अनदेखी करने वाले महीनों की गणना करते हैं। तो यह उत्तर सही नहीं है।
टॉमीक्स

अधिक तार्किक होगा: if ( date1.AddMonths(x).Month == date2.Month )तब आप x + 1 को महीनों की गणना के रूप में उपयोग करते हैं
टॉमीक्स

34

यदि आप पूरे महीने की सटीक संख्या चाहते हैं, तो हमेशा सकारात्मक (2000-01-15, 2000-02-14 रिटर्न 0), एक पूरे महीने पर विचार करना है जब आप अगले महीने उसी दिन पहुंचते हैं (आयु गणना की तरह कुछ)

public static int GetMonthsBetween(DateTime from, DateTime to)
{
    if (from > to) return GetMonthsBetween(to, from);

    var monthDiff = Math.Abs((to.Year * 12 + (to.Month - 1)) - (from.Year * 12 + (from.Month - 1)));

    if (from.AddMonths(monthDiff) > to || to.Day < from.Day)
    {
        return monthDiff - 1;
    }
    else
    {
        return monthDiff;
    }
}

संपादित कारण: कुछ मामलों में पुराना कोड सही नहीं था जैसे:

new { From = new DateTime(1900, 8, 31), To = new DateTime(1901, 8, 30), Result = 11 },

Test cases I used to test the function:

var tests = new[]
{
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1900, 1, 1), Result = 0 },
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1900, 1, 2), Result = 0 },
    new { From = new DateTime(1900, 1, 2), To = new DateTime(1900, 1, 1), Result = 0 },
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1900, 2, 1), Result = 1 },
    new { From = new DateTime(1900, 2, 1), To = new DateTime(1900, 1, 1), Result = 1 },
    new { From = new DateTime(1900, 1, 31), To = new DateTime(1900, 2, 1), Result = 0 },
    new { From = new DateTime(1900, 8, 31), To = new DateTime(1900, 9, 30), Result = 0 },
    new { From = new DateTime(1900, 8, 31), To = new DateTime(1900, 10, 1), Result = 1 },
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1901, 1, 1), Result = 12 },
    new { From = new DateTime(1900, 1, 1), To = new DateTime(1911, 1, 1), Result = 132 },
    new { From = new DateTime(1900, 8, 31), To = new DateTime(1901, 8, 30), Result = 11 },
};

सिर्फ इसलिए कि अन्य लोगों के लिए भ्रम से बचने के लिए, मुझे लगता है कि यह समाधान सही नहीं है। परीक्षण के मामले का उपयोग करना: new { From = new DateTime(2015, 12, 31), To = new DateTime(2015, 6, 30), Result = 6 } परीक्षण विफल हो जाएगा क्योंकि परिणाम 5. है
क्रिस्चियन Badila


मुझे यकीन नहीं है कि मुझे यह मिल गया है, मेरा फ़ंक्शन 6 को वापस आना चाहिए: dotnetfiddle.net/MRZNnC
Guillaume86

मैंने हाथ से परीक्षण के मामले की नकल की और इसमें गलती है। नाकाम रहने कल्पना होना चाहिए: new { From = new DateTime(2015, 12, 31), To = new DateTime(2016, 06, 30), Result = 6 }। "बग" to.Day < from.Dayकोड में निहित है जो इस बात को ध्यान में नहीं रखता है कि महीने "महीने के एक अलग दिन" में समाप्त हो सकते हैं। इस मामले में ३१ दिसंबर २०१५ से ३० जून २०१६ तक, ६ पूर्ण महीने बीत चुके होंगे (जून से लेकर ३० दिन तक) लेकिन आपका कोड ५ आयेगा
क्रिश्चियन बदीला

3
यह मेरी राय में अपेक्षित व्यवहार है, अच्छी तरह से या यह व्यवहार है जो मैं कम से कम उम्मीद करता हूं। मैंने एक पूरा महीना तैयार किया, जब आप उसी दिन (या इस मामले में अगले महीने की तरह) पहुँचते हैं।
गुइलियुमोरी

22

मैंने MSB के माध्यम से VB.NET में इस पद्धति के उपयोग की जाँच की और ऐसा लगता है कि इसमें बहुत सारे उपयोग हैं। C # में ऐसी कोई अंतर्निहित पद्धति नहीं है। (यहां तक ​​कि यह एक अच्छा विचार नहीं है) आप VB के C # में कॉल कर सकते हैं।

  1. Microsoft.VisualBasic.dllसंदर्भ के रूप में अपनी परियोजना में जोड़ें
  2. Microsoft.VisualBasic.DateAndTime.DateDiff अपने कोड में उपयोग करें

7
आपको क्यों लगता है कि यह एक अच्छा विचार नहीं है? सहज रूप से, मुझे लगता है कि पुस्तकालय रनटाइम के लिए 'बस एक और .NET लाइब्रेरी' है। ध्यान दें, मैं यहाँ शैतान के वकील का किरदार निभा रहा हूँ, मैं भी ऐसा करने के लिए बाध्य हूँ क्योंकि यह सिर्फ 'गलत लगता है' (धोखा देने का) है लेकिन मुझे आश्चर्य है कि ऐसा न करने का कोई ठोस तकनीकी कारण है।
एडम राल्फ

3
@AadRalph: ऐसा नहीं करने का कोई कारण नहीं। उन पुस्तकालयों को 100% प्रबंधित कोड में लागू किया गया है, इसलिए यह सब कुछ बाकी सभी के समान है। केवल बोधगम्य अंतर यह है कि Microsoft.VisualBasic.dllमॉड्यूल को लोड किया जाना है, लेकिन ऐसा करने में लगने वाला समय नगण्य है। अपने आप को पूरी तरह से परीक्षण और उपयोगी सुविधाओं से बाहर धोखा देने का कोई कारण नहीं है क्योंकि आपने अपना कार्यक्रम C # में लिखना चुना है। (यह जैसी चीजों के लिए चला जाता है My.Application.SplashScreenके रूप में अच्छी तरह से।)
कोड़ी ग्रे

3
क्या आप अपना दिमाग बदल देंगे अगर आपको पता था कि यह C # में लिखा गया था? ये था। इसी तर्क के द्वारा, System.Data और PresentationFramework का उपयोग करके भी धोखा दे रहा है, इसके पर्याप्त भाग C ++ / CLI में लिखे गए हैं।
हंस पसंत

3
@AdamRalph: उस "अजीब सामान" का कोई विशेष उदाहरण जो वसंत को ध्यान में रखता है? या आप कह रहे हैं कि विशुद्ध रूप से काल्पनिक? और हाँ, यह आपके कुछ सी # दोस्तों के दिमाग के साथ खिलवाड़ कर सकता है जो कोड की एक महाकाव्य राशि लिख रहे हैं जो कुछ ऐसा करने के लिए है जिसे आप सही usingबयान के साथ एक पंक्ति में कर सकते हैं , लेकिन मुझे संदेह है कि कोई भी गंभीर क्षति होगी।
कोड़ी ग्रे

1
@ कोडी ग्रे: सहमत, उदाहरण के रूप में आप वर्णन के रूप में तुच्छ है। यह इस तरह के एक असामान्य (सी # पीओवी) विधि से कॉल करके शुरू किया गया अतिरिक्त कोड 'शोर' है जिससे मैं बचने के लिए उत्सुक हूं। एक अच्छी तरह से संगठित टीम में इस तरह की चीजों को कोड समीक्षा में उठाया जाएगा और आसानी से बचा जा सकता है। BTW - मैं VB6 / VB.NET पर हमला करने की कोशिश नहीं कर रहा हूँ। मैंने ऐसे तरीकों को केवल 'अजीब' के रूप में वर्णित किया है, क्योंकि .NET POV से, DateAndTime.Year()अस्तित्व का कोई कारण नहीं है, यह देखते हुए कि DateTimeएक Yearसंपत्ति है। यह केवल VB.NET को VB6 की तरह अधिक प्रदर्शित करने के लिए मौजूद है। एक पूर्व VB6 प्रोग्रामर के रूप में, मैं इसकी सराहना कर सकता हूं ;-)
एडम राल्फ

10

महीनों में अंतर पाने के लिए (दोनों शुरू और अंत समावेशी), तारीखों के बावजूद:

DateTime start = new DateTime(2013, 1, 1);
DateTime end = new DateTime(2014, 2, 1);
var diffMonths = (end.Month + end.Year * 12) - (start.Month + start.Year * 12);

5
कल्पना कीजिए startऔर endसमान हैं। तब आपको एक परिणाम मिलता है। 1. यह कैसे सही है? आप परिणाम में 1 क्यों जोड़ते हैं? इस उत्तर पर मतदान कौन कर रहा है: - /?
पौल

समान तिथियों के लिए, यह 1 के रूप में आउटपुट देगा। मूल रूप से, यह सभी महीनों को समावेशी शुरुआत और अंत के महीनों में गिना जाएगा।
चिराग

3
मेरे लिए दो वस्तुओं के बीच अंतर की तरह ध्वनि नहीं है। 2 और 2 में क्या अंतर है? क्या यह वास्तव में 1 है? मैं सुझाव दूंगा कि अंतर 0. है
paul


7

मुझे बस कुछ आसान करने की ज़रूरत है जैसे कि रोजगार की तारीखें जहाँ केवल महीना / वर्ष दर्ज किया जाता है, इसलिए अलग-अलग वर्षों और महीनों में काम करना चाहिए। यह वही है जो मैं उपयोग करता हूं, यहां केवल उपयोगिता के लिए।

public static YearsMonths YearMonthDiff(DateTime startDate, DateTime endDate) {
    int monthDiff = ((endDate.Year * 12) + endDate.Month) - ((startDate.Year * 12) + startDate.Month) + 1;
    int years = (int)Math.Floor((decimal) (monthDiff / 12));
    int months = monthDiff % 12;
    return new YearsMonths {
        TotalMonths = monthDiff,
            Years = years,
            Months = months
    };
}

.NET फेल्ड


4

आप .NET के लिए टाइम पीरियड लाइब्रेरी के डेटडिफ़ क्लास का उपयोग कर सकते हैं :

// ----------------------------------------------------------------------
public void DateDiffSample()
{
  DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
  DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
  DateDiff dateDiff = new DateDiff( date1, date2 );

  // differences
  Console.WriteLine( "DateDiff.Months: {0}", dateDiff.Months );
  // > DateDiff.Months: 16

  // elapsed
  Console.WriteLine( "DateDiff.ElapsedMonths: {0}", dateDiff.ElapsedMonths );
  // > DateDiff.ElapsedMonths: 4

  // description
  Console.WriteLine( "DateDiff.GetDescription(6): {0}", dateDiff.GetDescription( 6 ) );
  // > DateDiff.GetDescription(6): 1 Year 4 Months 12 Days 12 Hours 41 Mins 29 Secs
} // DateDiffSample

2

यहाँ उन महीनों में अंतर पाने के लिए मेरा योगदान है जिन्हें मैंने सटीक पाया है:

namespace System
{
     public static class DateTimeExtensions
     {
         public static Int32 DiffMonths( this DateTime start, DateTime end )
         {
             Int32 months = 0;
             DateTime tmp = start;

             while ( tmp < end )
             {
                 months++;
                 tmp = tmp.AddMonths( 1 );
             }

             return months;
        }
    }
}

उपयोग:

Int32 months = DateTime.Now.DiffMonths( DateTime.Now.AddYears( 5 ) );

आप DiffYears नामक एक और विधि बना सकते हैं और ठीक उसी लूप में AddMonths के बजाय ऊपर और AddYears के समान तर्क लागू कर सकते हैं।


2

इसके लिए मुझे जो चाहिए, उसके लिए काम किया। महीने का दिन मेरे मामले में मायने नहीं रखता था क्योंकि यह हमेशा महीने का आखिरी दिन होता है।

public static int MonthDiff(DateTime d1, DateTime d2){
    int retVal = 0;

    if (d1.Month<d2.Month)
    {
        retVal = (d1.Month + 12) - d2.Month;
        retVal += ((d1.Year - 1) - d2.Year)*12;
    }
    else
    {
        retVal = d1.Month - d2.Month;
        retVal += (d1.Year - d2.Year)*12;
    }
    //// Calculate the number of years represented and multiply by 12
    //// Substract the month number from the total
    //// Substract the difference of the second month and 12 from the total
    //retVal = (d1.Year - d2.Year) * 12;
    //retVal = retVal - d1.Month;
    //retVal = retVal - (12 - d2.Month);

    return retVal;
}

2

सबसे सटीक तरीका यह है कि अंश द्वारा महीनों में अंतर वापस करें:

private double ReturnDiffereceBetweenTwoDatesInMonths(DateTime startDateTime, DateTime endDateTime)
{
    double result = 0;
    double days = 0;
    DateTime currentDateTime = startDateTime;
    while (endDateTime > currentDateTime.AddMonths(1))
    {
        result ++;

        currentDateTime = currentDateTime.AddMonths(1);
    }

    if (endDateTime > currentDateTime)
    {
        days = endDateTime.Subtract(currentDateTime).TotalDays;

    }
    return result + days/endDateTime.GetMonthDays;
}

2

यहां एक सरल समाधान है जो कम से कम मेरे लिए काम करता है। यह शायद सबसे तेज़ नहीं है, क्योंकि यह लूप में कूल डेटाइम के ऐडमार्ट फीचर का उपयोग करता है:

public static int GetMonthsDiff(DateTime start, DateTime end)
{
    if (start > end)
        return GetMonthsDiff(end, start);

    int months = 0;
    do
    {
        start = start.AddMonths(1);
        if (start > end)
            return months;

        months++;
    }
    while (true);
}

1
Public Class ClassDateOperation
    Private prop_DifferenceInDay As Integer
    Private prop_DifferenceInMonth As Integer
    Private prop_DifferenceInYear As Integer


    Public Function DayMonthYearFromTwoDate(ByVal DateStart As Date, ByVal DateEnd As Date) As ClassDateOperation
        Dim differenceInDay As Integer
        Dim differenceInMonth As Integer
        Dim differenceInYear As Integer
        Dim myDate As Date

        DateEnd = DateEnd.AddDays(1)

        differenceInYear = DateEnd.Year - DateStart.Year

        If DateStart.Month <= DateEnd.Month Then
            differenceInMonth = DateEnd.Month - DateStart.Month
        Else
            differenceInYear -= 1
            differenceInMonth = (12 - DateStart.Month) + DateEnd.Month
        End If


        If DateStart.Day <= DateEnd.Day Then
            differenceInDay = DateEnd.Day - DateStart.Day
        Else

            myDate = CDate("01/" & DateStart.AddMonths(1).Month & "/" & DateStart.Year).AddDays(-1)
            If differenceInMonth <> 0 Then
                differenceInMonth -= 1
            Else
                differenceInMonth = 11
                differenceInYear -= 1
            End If

            differenceInDay = myDate.Day - DateStart.Day + DateEnd.Day

        End If

        prop_DifferenceInDay = differenceInDay
        prop_DifferenceInMonth = differenceInMonth
        prop_DifferenceInYear = differenceInYear

        Return Me
    End Function

    Public ReadOnly Property DifferenceInDay() As Integer
        Get
            Return prop_DifferenceInDay
        End Get
    End Property

    Public ReadOnly Property DifferenceInMonth As Integer
        Get
            Return prop_DifferenceInMonth
        End Get
    End Property

    Public ReadOnly Property DifferenceInYear As Integer
        Get
            Return prop_DifferenceInYear
        End Get
    End Property

End Class

1

यह मेरी अपनी लाइब्रेरी से है, दो तिथियों के बीच महीनों का अंतर लौटाएगा।

public static int MonthDiff(DateTime d1, DateTime d2)
{
    int retVal = 0;

    // Calculate the number of years represented and multiply by 12
    // Substract the month number from the total
    // Substract the difference of the second month and 12 from the total
    retVal = (d1.Year - d2.Year) * 12;
    retVal = retVal - d1.Month;
    retVal = retVal - (12 - d2.Month);

    return retVal;
}

1
क्या यह काम करता है? मैं कागज पर 11 Jan-31-2014औरDec-31-2013
डेव कज़िनू

1

आप कुछ इस तरह से कार्य कर सकते हैं।

उदाहरण के लिए, 2012/12/27 से 2012/12/29 तक 3 दिन हो जाते हैं। इसी तरह, 2012/12/15 से 2013/01/15 पर 2 महीने हो जाते हैं, क्योंकि 2013/01/14 तक यह 1 महीना है। 15 तारीख से 2 महीने की शुरुआत हुई।

यदि आप गणना में दोनों दिनों को शामिल नहीं करना चाहते हैं, तो आप दूसरे में "=" हटा सकते हैं। अर्थात, 2012/12/15 से 2013/01/15 तक 1 महीना है।

public int GetMonths(DateTime startDate, DateTime endDate)
{
    if (startDate > endDate)
    {
        throw new Exception("Start Date is greater than the End Date");
    }

    int months = ((endDate.Year * 12) + endDate.Month) - ((startDate.Year * 12) + startDate.Month);

    if (endDate.Day >= startDate.Day)
    {
        months++;
    }

    return months;
}

1

आप निम्नलिखित एक्सटेंशन का उपयोग कर सकते हैं: कोड

public static class Ext
{
    #region Public Methods

    public static int GetAge(this DateTime @this)
    {
        var today = DateTime.Today;
        return ((((today.Year - @this.Year) * 100) + (today.Month - @this.Month)) * 100 + today.Day - @this.Day) / 10000;
    }

    public static int DiffMonths(this DateTime @from, DateTime @to)
    {
        return (((((@to.Year - @from.Year) * 12) + (@to.Month - @from.Month)) * 100 + @to.Day - @from.Day) / 100);
    }

    public static int DiffYears(this DateTime @from, DateTime @to)
    {
        return ((((@to.Year - @from.Year) * 100) + (@to.Month - @from.Month)) * 100 + @to.Day - @from.Day) / 10000;
    }

    #endregion Public Methods
}

कार्यान्वयन!

int Age;
int years;
int Months;
//Replace your own date
var d1 = new DateTime(2000, 10, 22);
var d2 = new DateTime(2003, 10, 20);
//Age
Age = d1.GetAge();
Age = d2.GetAge();
//positive
years = d1.DiffYears(d2);
Months = d1.DiffMonths(d2);
//negative
years = d2.DiffYears(d1);
Months = d2.DiffMonths(d1);
//Or
Months = Ext.DiffMonths(d1, d2);
years = Ext.DiffYears(d1, d2); 

1

यहाँ VB.Net DateDiff का उपयोग करके वर्ष, महीना, दिन के लिए अधिक संक्षिप्त समाधान दिया गया है। आप DateDiff लाइब्रेरी को C # में भी लोड कर सकते हैं।

date1 होना चाहिए <= date2

VB.NET

Dim date1 = Now.AddDays(-2000)
Dim date2 = Now
Dim diffYears = DateDiff(DateInterval.Year, date1, date2) - If(date1.DayOfYear > date2.DayOfYear, 1, 0)
Dim diffMonths = DateDiff(DateInterval.Month, date1, date2) - diffYears * 12 - If(date1.Day > date2.Day, 1, 0)
Dim diffDays = If(date2.Day >= date1.Day, date2.Day - date1.Day, date2.Day + (Date.DaysInMonth(date1.Year, date1.Month) - date1.Day))

सी#

DateTime date1 = Now.AddDays(-2000);
DateTime date2 = Now;
int diffYears = DateDiff(DateInterval.Year, date1, date2) - date1.DayOfYear > date2.DayOfYear ? 1 : 0;
int diffMonths = DateDiff(DateInterval.Month, date1, date2) - diffYears * 12 - date1.Day > date2.Day ? 1 : 0;
int diffDays = date2.Day >= date1.Day ? date2.Day - date1.Day : date2.Day + (System.DateTime.DaysInMonth(date1.Year, date1.Month) - date1.Day);

1

यह Kirk Woll के जवाब के जवाब में है। मेरे पास अभी तक एक टिप्पणी का जवाब देने के लिए पर्याप्त प्रतिष्ठा अंक नहीं हैं ...

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

यहाँ मेरा फिर से लिखना है:

public class DateTimeSpan {
    private DateTime _date1;
    private DateTime _date2;
    private int _years;
    private int _months;
    private int _days;
    private int _hours;
    private int _minutes;
    private int _seconds;
    private int _milliseconds;

    public int Years { get { return _years; } }
    public int Months { get { return _months; } }
    public int Days { get { return _days; } }
    public int Hours { get { return _hours; } }
    public int Minutes { get { return _minutes; } }
    public int Seconds { get { return _seconds; } }
    public int Milliseconds { get { return _milliseconds; } }

    public DateTimeSpan(DateTime date1, DateTime date2) {
        _date1 = (date1 > date2) ? date1 : date2;
        _date2 = (date2 < date1) ? date2 : date1;

        _years = _date1.Year - _date2.Year;
        _months = (_years * 12) + _date1.Month - _date2.Month;
        TimeSpan t = (_date2 - _date1);
        _days = t.Days;
        _hours = t.Hours;
        _minutes = t.Minutes;
        _seconds = t.Seconds;
        _milliseconds = t.Milliseconds;

    }

    public static DateTimeSpan CompareDates(DateTime date1, DateTime date2) {
        return new DateTimeSpan(date1, date2);
    }
}

उपयोग 1, बहुत अधिक समान:

void Main()
{
    DateTime compareTo = DateTime.Parse("8/13/2010 8:33:21 AM");
    DateTime now = DateTime.Parse("2/9/2012 10:10:11 AM");
    var dateSpan = new DateTimeSpan(compareTo, now);
    Console.WriteLine("Years: " + dateSpan.Years);
    Console.WriteLine("Months: " + dateSpan.Months);
    Console.WriteLine("Days: " + dateSpan.Days);
    Console.WriteLine("Hours: " + dateSpan.Hours);
    Console.WriteLine("Minutes: " + dateSpan.Minutes);
    Console.WriteLine("Seconds: " + dateSpan.Seconds);
    Console.WriteLine("Milliseconds: " + dateSpan.Milliseconds);
}

उपयोग 2, समान:

void Main()
{
    DateTime compareTo = DateTime.Parse("8/13/2010 8:33:21 AM");
    DateTime now = DateTime.Parse("2/9/2012 10:10:11 AM");
    Console.WriteLine("Years: " + DateTimeSpan.CompareDates(compareTo, now).Years);
    Console.WriteLine("Months: " + DateTimeSpan.CompareDates(compareTo, now).Months);
    Console.WriteLine("Days: " + DateTimeSpan.CompareDates(compareTo, now).Days);
    Console.WriteLine("Hours: " + DateTimeSpan.CompareDates(compareTo, now).Hours);
    Console.WriteLine("Minutes: " + DateTimeSpan.CompareDates(compareTo, now).Minutes);
    Console.WriteLine("Seconds: " + DateTimeSpan.CompareDates(compareTo, now).Seconds);
    Console.WriteLine("Milliseconds: " + DateTimeSpan.CompareDates(compareTo, now).Milliseconds);
}

1

मेरे मामले में अगले महीने में इस दिन से पहले शुरू होने वाले दिन से पूरे महीने की गणना करना आवश्यक है या महीने के शुरू से अंत तक।


Ex: 1/1/2018 से 31/1/2018 तक पूरा महीना होता है
Ex2: 5/1/2018 से 4/2/2018 को पूरा एक महीना होता है

यहाँ इस पर आधारित मेरा समाधान है:

public static DateTime GetMonthEnd(DateTime StartDate, int MonthsCount = 1)
{
    return StartDate.AddMonths(MonthsCount).AddDays(-1);
}
public static Tuple<int, int> CalcPeriod(DateTime StartDate, DateTime EndDate)
{
    int MonthsCount = 0;
    Tuple<int, int> Period;
    while (true)
    {
        if (GetMonthEnd(StartDate) > EndDate)
            break;
        else
        {
            MonthsCount += 1;
            StartDate = StartDate.AddMonths(1);
        }
    }
    int RemainingDays = (EndDate - StartDate).Days + 1;
    Period = new Tuple<int, int>(MonthsCount, RemainingDays);
    return Period;
}

उपयोग:

Tuple<int, int> Period = CalcPeriod(FromDate, ToDate);

नोट: मेरे मामले में पूरे महीनों के बाद शेष दिनों की गणना करना आवश्यक था, इसलिए यदि यह आपका मामला नहीं है तो आप उन दिनों के परिणाम को अनदेखा कर सकते हैं या यहां तक ​​कि आप ट्यूपल से पूर्णांक में वापसी की विधि भी बदल सकते हैं।


1
public static int PayableMonthsInDuration(DateTime StartDate, DateTime EndDate)
{
    int sy = StartDate.Year; int sm = StartDate.Month; int count = 0;
    do
    {
        count++;if ((sy == EndDate.Year) && (sm >= EndDate.Month)) { break; }
        sm++;if (sm == 13) { sm = 1; sy++; }
    } while ((EndDate.Year >= sy) || (EndDate.Month >= sm));
    return (count);
}

यह समाधान रेंटल / सब्सक्रिप्शन गणना के लिए है, जहां अंतर का मतलब घटाव नहीं है, यह उन दो तिथियों के भीतर की अवधि के लिए है।


1

3 मामले हैं: एक ही वर्ष, पिछले वर्ष और अन्य वर्ष।

अगर महीने का दिन मायने नहीं रखता ...

public int GetTotalNumberOfMonths(DateTime start, DateTime end)
{
    // work with dates in the right order
    if (start > end)
    {
        var swapper = start;
        start = end;
        end = swapper;
    }

    switch (end.Year - start.Year)
    {
        case 0: // Same year
            return end.Month - start.Month;

        case 1: // last year
            return (12 - start.Month) + end.Month;

        default:
            return 12 * (3 - (end.Year - start.Year)) + (12 - start.Month) + end.Month;
    }
}

1

मैंने इसे पूरा करने के लिए एक फ़ंक्शन लिखा, क्योंकि अन्य तरीके मेरे लिए काम नहीं कर रहे थे।

public string getEndDate (DateTime startDate,decimal monthCount)
{
    int y = startDate.Year;
    int m = startDate.Month;

    for (decimal  i = monthCount; i > 1; i--)
    {
        m++;
        if (m == 12)
        { y++;
            m = 1;
        }
    }
    return string.Format("{0}-{1}-{2}", y.ToString(), m.ToString(), startDate.Day.ToString());
}

कृपया अंग्रेजी में उत्तर दें (बनाम किसी भी आविष्कृत भाषा ...)
क्लेओपेट्रा

सिर्फ शुरुआत क्यों नहीं करें। अतिरिक्त। महीने (महीने) यह वैसे भी पूछे गए मूल प्रश्न का उत्तर नहीं देता है!
TabbyCool

ओह, माफ करना, @TabbyCool, यह कोड मेरे कार्यक्रम में अच्छा काम करता है! प्रोग्रामर नियम कहता है: पहले कोड काम करता है और फिर अनुकूलन! tanx for ur comment :)
reza akhlaghi

1

2 महीनों के बीच के कुल महीनों के अंतर के बारे में मेरी समझ में एक अभिन्न और एक आंशिक भाग (तारीख मायने रखती है) है।

अभिन्न अंग पूरे महीने का अंतर है।

मेरे लिए भिन्नात्मक भाग, शुरुआती और समाप्त होने वाले महीनों के बीच दिन के% (महीने के पूरे दिन तक) का अंतर है।

public static class DateTimeExtensions
{
    public static double TotalMonthsDifference(this DateTime from, DateTime to)
    {
        //Compute full months difference between dates
        var fullMonthsDiff = (to.Year - from.Year)*12 + to.Month - from.Month;

        //Compute difference between the % of day to full days of each month
        var fractionMonthsDiff = ((double)(to.Day-1) / (DateTime.DaysInMonth(to.Year, to.Month)-1)) -
            ((double)(from.Day-1)/ (DateTime.DaysInMonth(from.Year, from.Month)-1));

        return fullMonthsDiff + fractionMonthsDiff;
    }
}

इस विस्तार के साथ, वे परिणाम हैं:

2/29/2000 TotalMonthsDifference 2/28/2001 => 12
2/28/2000 TotalMonthsDifference 2/28/2001 => 12.035714285714286
01/01/2000 TotalMonthsDifference 01/16/2000 => 0.5
01/31/2000 TotalMonthsDifference 01/01/2000 => -1.0
01/31/2000 TotalMonthsDifference 02/29/2000 => 1.0
01/31/2000 TotalMonthsDifference 02/28/2000 => 0.9642857142857143
01/31/2001 TotalMonthsDifference 02/28/2001 => 1.0

1

इस पर बहुत सारे स्पष्ट जवाब नहीं हैं क्योंकि आप हमेशा चीजों को ग्रहण कर रहे हैं।

यह समाधान दो तिथियों के बीच की गणना के बीच के महीनों की गणना करता है जिसे आप तुलना के लिए महीने का दिन बचाना चाहते हैं (इसका अर्थ है कि गणना में महीने का दिन माना जाता है)

उदाहरण, यदि आपके पास 30 जनवरी 2012 की तारीख है, तो 29 फरवरी 2012 को एक महीना नहीं, बल्कि 01 मार्च 2013 होगा।

यह बहुत अच्छी तरह से परीक्षण किया गया है, शायद हम इसे बाद में साफ कर देंगे क्योंकि हम इसका उपयोग करते हैं, लेकिन यहां:

private static int TotalMonthDifference(DateTime dtThis, DateTime dtOther)
{
    int intReturn = 0;
    bool sameMonth = false;

    if (dtOther.Date < dtThis.Date) //used for an error catch in program, returns -1
        intReturn--;

    int dayOfMonth = dtThis.Day; //captures the month of day for when it adds a month and doesn't have that many days
    int daysinMonth = 0; //used to caputre how many days are in the month

    while (dtOther.Date > dtThis.Date) //while Other date is still under the other
    {
        dtThis = dtThis.AddMonths(1); //as we loop, we just keep adding a month for testing
        daysinMonth = DateTime.DaysInMonth(dtThis.Year, dtThis.Month); //grabs the days in the current tested month

        if (dtThis.Day != dayOfMonth) //Example 30 Jan 2013 will go to 28 Feb when a month is added, so when it goes to march it will be 28th and not 30th
        {
            if (daysinMonth < dayOfMonth) // uses day in month max if can't set back to day of month
                dtThis.AddDays(daysinMonth - dtThis.Day);
            else
                dtThis.AddDays(dayOfMonth - dtThis.Day);
        }
        if (((dtOther.Year == dtThis.Year) && (dtOther.Month == dtThis.Month))) //If the loop puts it in the same month and year
        {
            if (dtOther.Day >= dayOfMonth) //check to see if it is the same day or later to add one to month
                intReturn++;
            sameMonth = true; //sets this to cancel out of the normal counting of month
        }
        if ((!sameMonth)&&(dtOther.Date > dtThis.Date))//so as long as it didn't reach the same month (or if i started in the same month, one month ahead, add a month)
            intReturn++;
    }
    return intReturn; //return month
}

1

ऊपर किए गए उत्कृष्ट DateTimeSpan कार्य के आधार पर, मैंने कोड को थोड़ा सामान्य किया है; यह बहुत अच्छी तरह से काम करने लगता है:

public class DateTimeSpan
{
  private DateTimeSpan() { }

  private DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
  {
    Years = years;
    Months = months;
    Days = days;
    Hours = hours;
    Minutes = minutes;
    Seconds = seconds;
    Milliseconds = milliseconds;
  }

  public int Years { get; private set; } = 0;
  public int Months { get; private set; } = 0;
  public int Days { get; private set; } = 0;
  public int Hours { get; private set; } = 0;
  public int Minutes { get; private set; } = 0;
  public int Seconds { get; private set; } = 0;
  public int Milliseconds { get; private set; } = 0;

  public static DateTimeSpan CompareDates(DateTime StartDate, DateTime EndDate)
  {
    if (StartDate.Equals(EndDate)) return new DateTimeSpan();
    DateTimeSpan R = new DateTimeSpan();
    bool Later;
    if (Later = StartDate > EndDate)
    {
      DateTime D = StartDate;
      StartDate = EndDate;
      EndDate = D;
    }

    // Calculate Date Stuff
    for (DateTime D = StartDate.AddYears(1); D < EndDate; D = D.AddYears(1), R.Years++) ;
    if (R.Years > 0) StartDate = StartDate.AddYears(R.Years);
    for (DateTime D = StartDate.AddMonths(1); D < EndDate; D = D.AddMonths(1), R.Months++) ;
    if (R.Months > 0) StartDate = StartDate.AddMonths(R.Months);
    for (DateTime D = StartDate.AddDays(1); D < EndDate; D = D.AddDays(1), R.Days++) ;
    if (R.Days > 0) StartDate = StartDate.AddDays(R.Days);

    // Calculate Time Stuff
    TimeSpan T1 = EndDate - StartDate;
    R.Hours = T1.Hours;
    R.Minutes = T1.Minutes;
    R.Seconds = T1.Seconds;
    R.Milliseconds = T1.Milliseconds;

    // Return answer. Negate values if the Start Date was later than the End Date
    if (Later)
      return new DateTimeSpan(-R.Years, -R.Months, -R.Days, -R.Hours, -R.Minutes, -R.Seconds, -R.Milliseconds);
    return R;
  }
}

जब मेरी तुलना CompareDates(x, y)कहां x={01/02/2019 00:00:00}और y={01/05/2020 00:00:00}फिर Monthsमुझे दी जाती है2
बस्सी

1

यह सरल स्थिर कार्य दो डेटासेटाइमों के बीच महीनों के अंश की गणना करता है, जैसे

  • 1.1। से 31.1। = 1.0
  • 1.4। से 15.4। = 0.5
  • 16.4। से 30.4। = 0.5
  • 1.3। से 1.4। = 1 + 1/30

फ़ंक्शन मानता है कि पहली तारीख दूसरी तारीख से छोटी है। नकारात्मक समय अंतराल से निपटने के लिए, कोई शुरुआत में एक संकेत और एक चर स्वैप शुरू करके आसानी से फ़ंक्शन को संशोधित कर सकता है।

public static double GetDeltaMonths(DateTime t0, DateTime t1)
{
     DateTime t = t0;
     double months = 0;
     while(t<=t1)
     {
         int daysInMonth = DateTime.DaysInMonth(t.Year, t.Month);
         DateTime endOfMonth = new DateTime(t.Year, t.Month, daysInMonth);
         int cutDay = endOfMonth <= t1 ? daysInMonth : t1.Day;
         months += (cutDay - t.Day + 1) / (double) daysInMonth;
         t = new DateTime(t.Year, t.Month, 1).AddMonths(1);
     }
     return Math.Round(months,2);
 }

0

महीनों में 2 तिथियों के बीच अंतर की गणना करने में सक्षम होना एक पूरी तरह से तार्किक बात है, और कई व्यावसायिक अनुप्रयोगों में इसकी आवश्यकता है। यहाँ कई कोडर्स ने टिप्पणी दी है जैसे - "मई 1,2010" और "जून 16,2010 के बीच महीनों में क्या अंतर है, 31 दिसंबर 2010 और 1 जनवरी 2011 के बीच के महीनों में क्या अंतर है? - समझने में विफल रहे हैं। व्यापार अनुप्रयोगों की मूल बातें।

यहाँ उपरोक्त 2 टिप्पणियों का उत्तर है - 1-मई -2010 और 16-जून -2010 के बीच महीनों की संख्या 1 महीने है, 31-दिसबंर 2010 और 1-जून -2011 के बीच महीनों की संख्या 0. यह है 1.5 महीने और 1 सेकंड के रूप में उनकी गणना करना बहुत ही मूर्खतापूर्ण होगा, जैसा कि ऊपर दिए गए कोडर ने सुझाया है।

जो लोग क्रेडिट कार्ड, बंधक प्रसंस्करण, कर प्रसंस्करण, किराए पर प्रसंस्करण, मासिक ब्याज गणना और अन्य व्यावसायिक समाधानों की एक विशाल विविधता पर सहमत होंगे।

समस्या यह है कि इस तरह के फ़ंक्शन को उस मामले के लिए C # या VB.NET में शामिल नहीं किया गया है। डेटिफ़ को केवल खाते के वर्षों या महीने के घटक में शामिल किया जाता है, इसलिए वास्तव में बेकार है।

यहां कुछ वास्तविक जीवन के उदाहरण दिए गए हैं जहां आपको महीनों की गणना करने और सही ढंग से करने की आवश्यकता है:

आप 18-फ़ेब से 23-अगस्त तक एक अल्पकालिक किराए पर रहते थे। आप कितने महीने वहां रहे? जवाब एक सरल है - 6 महीने

आपके पास एक बैंक अकाउन्ट है जहाँ ब्याज की गणना की जाती है और हर महीने के अंत में भुगतान किया जाता है। आप 10-जून को पैसा जमा करते हैं और इसे 29-अक्टूबर (उसी वर्ष) निकालते हैं। आपको कितने महीनों के लिए ब्याज मिलता है? बहुत सरल जवाब- 4 महीने (फिर से अतिरिक्त दिन मायने नहीं रखते)

व्यावसायिक अनुप्रयोगों में, अधिकांश समय, जब आपको महीनों की गणना करने की आवश्यकता होती है, तो इसका कारण यह है कि आपको समय की गणना करने के तरीके के आधार पर 'पूर्ण' महीनों को जानना होगा; कुछ अमूर्त / अप्रासंगिक विचारों पर आधारित नहीं।


5
यह एक कारण है कि लेखांकन गणित नहीं है। लेखांकन में परिणाम आपके द्वारा गणना किए जाने के तरीके पर निर्भर करता है .. मुझे आपके बिंदु पता हैं और मुझे इस पर "सामान्य व्यापार दृश्य" पता है, लेकिन यह स्पष्टीकरण स्पष्ट रूप से गलत है। 2012.11.30 और 2012.12.01 के बीच या तो 0, या 1/30, या 1/31, या 1 या 2 महीने है, इस पर निर्भर करता है कि आपने क्या मांगा । क्या तिथियां अनन्य या समावेशी थीं? क्या आपने पार किए गए, छुआ या पास किए गए महीनों की संख्या पूछी? क्या आप राउंड-अप, राउंड-डाउन, या सटीक चाहते हैं?
quetzalcoatl

3
अब इसे किसी बिजनेस मैन या अकाउंटेंट को समझाइए और वे आपको हैरान कर देने वाला लुक देंगे। यह हमेशा "उनके लिए इतना स्पष्ट है कि वे निश्चित रूप से एक्स और वाई और जेड का मतलब है, आप अलग तरीके से कैसे सोच सकते हैं?" अब कई व्यवसायी लोगों को प्राप्त करें और उन्हें विषय पर सहमत होने की कोशिश करें। लेखाकार के सहमत होने की अधिक संभावना है, क्योंकि कुछ बिंदु पर वे गणित का उपयोग करेंगे कि वे किस विकल्प के साथ जांच कर सकते हैं कि वे एक ही अवधि को दो बार समान रूप से जोड़ सकते हैं, आदि। यहां तक ​​कि गणना के आपके उदाहरण विवादित और क्षेत्र-निर्भर हैं, या स्पष्ट रूप से अमान्य हैं क्योंकि वे मानते हैं अतिरिक्त दिनों की अनदेखी जैसे अतिरिक्त व्यावसायिक नियम।
quetzalcoatl

2
-1 आप मान रहे हैं कि सभी सॉफ्टवेयर एक "व्यावसायिक अनुप्रयोग" है। प्रश्न में कोड के उद्देश्य का उल्लेख नहीं किया गया है। आप यह भी मानते हैं कि सभी "व्यावसायिक अनुप्रयोगों" में समान नियम हैं, जो निश्चित रूप से सच नहीं है।
जेसी वेब

0

विस्तारित किर्क संरचना ToString (प्रारूप) और अवधि (लंबे एमएस) के साथ

 public struct DateTimeSpan
{
    private readonly int years;
    private readonly int months;
    private readonly int days;
    private readonly int hours;
    private readonly int minutes;
    private readonly int seconds;
    private readonly int milliseconds;

    public DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
    {
        this.years = years;
        this.months = months;
        this.days = days;
        this.hours = hours;
        this.minutes = minutes;
        this.seconds = seconds;
        this.milliseconds = milliseconds;
    }

    public int Years { get { return years; } }
    public int Months { get { return months; } }
    public int Days { get { return days; } }
    public int Hours { get { return hours; } }
    public int Minutes { get { return minutes; } }
    public int Seconds { get { return seconds; } }
    public int Milliseconds { get { return milliseconds; } }

    enum Phase { Years, Months, Days, Done }


    public string ToString(string format)
    {
        format = format.Replace("YYYY", Years.ToString());
        format = format.Replace("MM", Months.ToString());
        format = format.Replace("DD", Days.ToString());
        format = format.Replace("hh", Hours.ToString());
        format = format.Replace("mm", Minutes.ToString());
        format = format.Replace("ss", Seconds.ToString());
        format = format.Replace("ms", Milliseconds.ToString());
        return format;
    }


    public static DateTimeSpan Duration(long ms)
    {
        DateTime dt = new DateTime();
        return CompareDates(dt, dt.AddMilliseconds(ms));
    }


    public static DateTimeSpan CompareDates(DateTime date1, DateTime date2)
    {
        if (date2 < date1)
        {
            var sub = date1;
            date1 = date2;
            date2 = sub;
        }

        DateTime current = date1;
        int years = 0;
        int months = 0;
        int days = 0;

        Phase phase = Phase.Years;
        DateTimeSpan span = new DateTimeSpan();

        while (phase != Phase.Done)
        {
            switch (phase)
            {
                case Phase.Years:
                    if (current.AddYears(years + 1) > date2)
                    {
                        phase = Phase.Months;
                        current = current.AddYears(years);
                    }
                    else
                    {
                        years++;
                    }
                    break;
                case Phase.Months:
                    if (current.AddMonths(months + 1) > date2)
                    {
                        phase = Phase.Days;
                        current = current.AddMonths(months);
                    }
                    else
                    {
                        months++;
                    }
                    break;
                case Phase.Days:
                    if (current.AddDays(days + 1) > date2)
                    {
                        current = current.AddDays(days);
                        var timespan = date2 - current;
                        span = new DateTimeSpan(years, months, days, timespan.Hours, timespan.Minutes, timespan.Seconds, timespan.Milliseconds);
                        phase = Phase.Done;
                    }
                    else
                    {
                        days++;
                    }
                    break;
            }
        }

        return span;
    }
}

0
  var dt1 = (DateTime.Now.Year * 12) + DateTime.Now.Month;
  var dt2 = (DateTime.Now.AddMonths(-13).Year * 12) + DateTime.Now.AddMonths(-13).Month;
  Console.WriteLine(dt1);
  Console.WriteLine(dt2);
  Console.WriteLine((dt1 - dt2));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.