দুটি তারিখের মধ্যে মাসের মধ্যে পার্থক্য


334

সি # তে দুটি তারিখের মধ্যে মাসের মধ্যে পার্থক্যটি কীভাবে গণনা করবেন?

DateDiff()সি # তে ভিবি পদ্ধতির সমতুল্য রয়েছে কি ? বছর দুটো বাদে দু'টি তারিখের মধ্যে কয়েক মাসের মধ্যে আমার পার্থক্য খুঁজে পাওয়া দরকার। ডকুমেন্টেশন বলছে যে আমি এর TimeSpanমতো ব্যবহার করতে পারি :

TimeSpan ts = date1 - date2;

তবে এটি আমাকে দিনগুলিতে ডেটা দেয়। আমি এই সংখ্যাটি 30 দ্বারা ভাগ করতে চাই না কারণ প্রতি মাসে 30 দিন হয় না এবং যেহেতু দুটি অপরেন্ড মান একে অপরের থেকে একেবারে পৃথক, তাই আমি 30 দ্বারা বিভক্ত হওয়া আমাকে একটি ভুল মূল্য দিতে পারে বলে ভীত।

কোন পরামর্শ?


27
"মাসের মধ্যে পার্থক্য" সংজ্ঞায়িত করুন, "মে 1,2010" এবং "জুন 16,2010" এর মধ্যে মাসের মধ্যে পার্থক্য কী? ১.৫, ১ বা অন্য কিছু?
চেং চেন

7
অথবা, এই বিষয়টিকে আরও চাপ দেওয়ার জন্য, 31 ডিসেম্বর 2010 এবং 1 জানুয়ারী 2011 এর মধ্যে কয়েক মাসের মধ্যে পার্থক্য কী? দিনের উপর নির্ভর করে এটি কেবল 1 সেকেন্ডের পার্থক্য হতে পারে; আপনি এটি এক মাসের পার্থক্য হিসাবে গণনা করবেন?
স্টাকেক্স -

এখানে সহজ এবং ক্ষেত্রে শর্ট কোড, আপনি কি এখনও উত্তর, পাই নি এই দেখতে পোষ্ট stackoverflow.com/questions/8820603/...
wirol

11
ড্যানি: 1 মাস 15 দিন। স্টাকেক্স: 0 মাস এবং 1 দিন। পয়েন্টটি হল মাসের উপাদানটি পাওয়া। এটি আমার কাছে বেশ সুস্পষ্ট বলে মনে হচ্ছে এবং এটি একটি ভাল প্রশ্ন।
কির্ক ওল

DateDiffইমপ্লান্টেশন: রেফারেন্সসোর্স.মাইক্রোসফট.কম ## মাইক্রোসফট.ভিজুয়ালবাসিক / …
dovid

উত্তর:


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
@ কুরু - ৩5৫ / ১২ দিনগুলিতে এক মাসের গড় দৈর্ঘ্যের আনুমানিক পরিমাপ। এটি একটি সঠিক পরিমাপ। ছোট তারিখের ব্যাপ্তির জন্য এই ত্রুটিটি সহ্য করা যেতে পারে তবে খুব বিশাল তারিখের জন্য এই ত্রুটিটি তাত্পর্যপূর্ণ হয়ে উঠতে পারে।
অ্যাডাম রাল্ফ

21
আমি মনে করি এটি দিবসের উপাদান বিবেচনা করা প্রয়োজন। এরকম কিছু (date1.Year - date2.Year) * 12 + date1.Month - date2.Month + (date1.Day >= date2.Day ? 0 : -1)
ড্রঙ্ককোডার

2
@ ড্রঙ্ককোডার এটি একটি প্রদত্ত সিস্টেমের প্রয়োজনীয়তার উপর নির্ভর করে। কিছু ক্ষেত্রে আপনার সমাধানটি অবশ্যই সেরা পছন্দ হতে পারে। উদাহরণস্বরূপ, যখন দুটি তারিখ 31 দিনের মাস, 30 দিনের মাস, 28 ফেব্রুয়ারি বা 29 দিনের ফেব্রুয়ারিতে বিস্তৃত হয় তখন কী হবে তা বিবেচনা করা গুরুত্বপূর্ণ। যদি আপনার সূত্রের ফলাফলগুলি সিস্টেমের প্রয়োজনীয় জিনিসগুলি সরবরাহ করে তবে এটি পরিষ্কারভাবে সঠিক পছন্দ। যদি তা না হয় তবে অন্য কিছু প্রয়োজন।
অ্যাডাম রাল্ফ

6
অ্যাডাম যা বলেছিলেন, তার দ্বিতীয় স্থানে আমি অ্যাকুচারারিগুলির জন্য কোড লেখার জন্য বছর কাটিয়েছি। কিছু গণনাগুলি মাসের সংখ্যাটি পেতে 30 টি করে বাড়িয়ে দিন সংখ্যা দ্বারা বিভক্ত হয় । কখনও কখনও প্রতিটি তারিখ ধরে নেওয়া মাস গণনা মাসের প্রথম মাসে শুরু হয়, সেই অনুযায়ী পুরো মাস গণনা করুন । তারিখ গণনা করার সময় কোনও সেরা পদ্ধতি নেই । আপনি যদি গ্রাহক না হন তবে আপনি কোডটি লিখছেন, তবে এই চেইনটিকে ব্যাক আপ করুন এবং সম্ভবত আপনার গ্রাহক অ্যাকাউন্ট্যান্ট দ্বারা এটি পরিষ্কার করুন।
বাইনারি ওয়ারিয়ার

1
365.2425 হ'ল গ্রেগরিয়ান ক্যালেন্ডারে দিনগুলির সংখ্যার আরও সঠিক সংখ্যা, যদি আপনি এটি ব্যবহার করছেন। তবে ডেটটাইম.ম্যাক্সভ্যালু (জানুয়ারী 1, 10000) দ্বারা এটি প্রায় 59 দিনের পার্থক্য। এছাড়াও, এক বছরের সংজ্ঞা আপনার দৃষ্টিকোণ en.wikedia.org/wiki/Year এর উপর নির্ভর করে অনেক আলাদা হতে পারে ।
গ্যারি

206

এটির সাথে 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
কিরকওয়াল ধন্যবাদ কিন্তু কেন যে DateTimeSpan ফেরৎ 34এই তারিখের সময় পার্থক্য দিনের জন্য আসলে এটা 35 timeanddate.com/date/...
Deeptechtons

@ ডিপটেকটনস, দুর্দান্ত ধরা দু'টি সমস্যা ছিল যা আপনি আমার নজরে এনেছিলেন, উভয়ই শুরুর তারিখের সাথে করণীয় ছিল 31এবং তারিখটি কয়েক দিন সহ কয়েক মাস "পার হয়ে যায়"। আমি যুক্তিটি উল্টিয়েছি (যাতে এটি বিপরীতে তুলনায় প্রথম দিকে যায়) এবং এখন বর্তমান তারিখটি পরিবর্তন না করেই মাসগুলি সংগ্রহ করে (এবং এভাবে কয়েক দিনের মধ্যে কয়েক মাসের মধ্যে পার হয়ে যায়) এখনও পুরোপুরি নিশ্চিত নয় যে আদর্শ ফলাফলটি কী তুলনা 10/31/2012করার সময় হওয়া উচিত 11/30/2012। এখনই ফলাফল1 মাস।
কির্ক ওল

@ কির্কওয়াল আপডেটের জন্য ধন্যবাদ, আমি আরও কিছু পরীক্ষা পেয়েছি কিছু পরীক্ষার পরে এটির
নিশ্চয়তা দিতে দেব

1
আমি অনুরূপ প্রশ্নের উত্তর stackoverflow.com/a/17537472/1737957 লিখেছি যা প্রস্তাবিত উত্তরগুলির পরীক্ষা করেছে (এবং দেখা গেছে যে তাদের বেশিরভাগ কাজ করে না)। এই উত্তরটি কাজ করে এমন কয়েকজনের মধ্যে একটি (আমার পরীক্ষার স্যুট অনুসারে)। আমার উত্তরের গিথুবের লিঙ্ক।
jwg

@ কিরকওয়াল - এই উত্তরটি এমন প্রান্তের ক্ষেত্রে কাজ করবে না যেখানে তারিখের তারিখের তারিখের তারিখের তারিখের চেয়ে এক মাসের বেশি বা উত্সের তারিখটি একটি লিপ দিন। চেষ্টা 2020-02-29করুন 2021-06-29- এটি "1y 4m 1d" ফেরায়, তবে মানটি "1y 4 মি 0 ডি" হওয়া উচিত, তাই না?
igগিরিভিটি

37

আপনি করতে পারেন

if ( date1.AddMonths(x) > date2 )

এটি খুব সহজ এবং আমার জন্য নিখুঁত কাজ করে। আমি 1 মাসের শেষে থেকে কম তারিখের পরের মাসের শেষের তারিখের তারিখ গণনা করার সময় এটি লক্ষ্য হিসাবে কাজ করে দেখে আনন্দিত অবাক হয়েছি। উদাহরণস্বরূপ .. 1-31-2018 + 1 মাস = 28 ফেব্রুয়ারী 218
ভাগ্যবান.অভিষেক

এটি সর্বোত্তম সমাধানগুলির মধ্যে একটি।
barnacle.m

সত্যিই সহজ এবং দক্ষ সমাধান! সেরা উত্তর প্রস্তাবিত।
সিড্রিক আর্নল্ড

2
তারিখ 1 = 2018-10-28 এবং তারিখ 2 = 2018-12-21 হলে কী হবে? উত্তরটি ২ হবে while সঠিক উত্তর হওয়া উচিত ৩ date তারিখের পরিসীমা 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 }
কেসটি


আমি নই নিশ্চিত আমি এটি পেতে, আমার ফাংশন আয় 6 এটি করা উচিত: dotnetfiddle.net/MRZNnC
Guillaume86

আমি পরীক্ষার কেসটি হাতে হাতে এখানে অনুলিপি করেছি এবং এতে একটি ভুল হয়েছে। ব্যর্থ বৈশিষ্ট হওয়া উচিত: new { From = new DateTime(2015, 12, 31), To = new DateTime(2016, 06, 30), Result = 6 }। "বাগ" কোডটিতে রয়েছে to.Day < from.Dayযা মাসগুলিকে বিবেচনা করে না যে মাসগুলি একটি ভিন্ন "মাসের দিন" এ শেষ হতে পারে। এক্ষেত্রে 31 ডিসেম্বর 2015, 30 জুন 2016 পর্যন্ত 6 টি পূর্ণ মাস
কেটে

3
এটি আমার মতে প্রত্যাশিত আচরণ, ভাল বা এটি আচরণ যা আমি কমপক্ষে প্রত্যাশা করি। আপনি যখন একই দিনে পৌঁছবেন তখনই আমি সম্পূর্ণ মাসটি সংক্ষিপ্ত করে রেখেছি (বা পরের মাসে এই ক্ষেত্রে যেমন হয়)।
Guillaume86

22

আমি এমএসডিএন এর মাধ্যমে ভিবি.এনইটি-তে এই পদ্ধতির ব্যবহার পরীক্ষা করেছি এবং মনে হচ্ছে এটির প্রচুর ব্যবহার রয়েছে। সি # তে এরকম অন্তর্নির্মিত কোনও পদ্ধতি নেই। (এমনকি এটি একটি ভাল ধারণা নয়) আপনি সি # তে ভিবি'র কল করতে পারেন।

  1. যোগ Microsoft.VisualBasic.dllএকটি রেফারেন্স হিসাবে আপনার প্রকল্পে
  2. Microsoft.VisualBasic.DateAndTime.DateDiff আপনার কোড ব্যবহার করুন

7
আপনি কেন এটি একটি ভাল ধারণা না বলে মনে করেন? স্বজ্ঞাতভাবে, আমি অনুমান করব যে লাইব্রেরিটি রানটাইমের জন্য 'অন্য একটি। নেট লাইব্রেরি'। দ্রষ্টব্য, আমি এখানে শয়তানের উকিল খেলছি, আমি এটি করতে নারাজ হব কারণ এটি কেবল 'ভুল মনে করে' (প্রতারণার একধরণের) তবে আমি অবাক হয়েছি যে এটি না করার কোনও দৃ technical়প্রযুক্ত প্রযুক্তিগত কারণ রয়েছে কিনা।
অ্যাডাম রাল্ফ

3
@ অ্যাডামাল্ফ: এটি না করার কোনও কারণ নেই। এই লাইব্রেরিগুলি 100% পরিচালিত কোডে প্রয়োগ করা হয়, সুতরাং এটি সমস্ত কিছুর সমান। একমাত্র Microsoft.VisualBasic.dllঅনুমিত পার্থক্য হ'ল মডিউলটি লোড করতে হয়, তবে এটি করতে যে সময় লাগে তা তুচ্ছ। আপনি নিজের প্রোগ্রামটি সি # তে লেখার জন্য বেছে নিয়েছেন বলে পুরোপুরি পরীক্ষিত এবং দরকারী বৈশিষ্ট্যগুলি থেকে নিজেকে ঠকানোর কোনও কারণ নেই। (এটি My.Application.SplashScreenপাশাপাশি জিনিসগুলির জন্যও যায় ))
কোডি গ্রে

3
যদি আপনি জানতেন যে এটি সি # তে লেখা ছিল? ইহা ছিল. একই যুক্তি অনুসারে, সিস্টেম.ডাটা এবং উপস্থাপনা ফ্রেমওয়ার্ক ব্যবহার করেও প্রতারণা করা হচ্ছে, এর বেশিরভাগ অংশ সি ++ / সিএমএতে লেখা রয়েছে।
হ্যানস প্যাস্যান্ট

3
@ অ্যাডামাল্ফ: মনে আছে যে "অদ্ভুত লাগেজ" এর কোনও বিশেষ উদাহরণ? বা আপনি কি নিখুঁত অনুমানমূলকভাবে বলছেন? এবং হ্যাঁ, এটি আপনার কিছু সি # বন্ধুদের মনে জগাখিচুড়ি হতে পারে যারা একটি মহাকাব্য পরিমাণ কোড লিখে কিছু করছেন যা আপনি সঠিক usingবক্তব্য সহ এক লাইনে করতে পারেন , তবে আমার সন্দেহ আছে যে এর কোনও মারাত্মক ক্ষতি হতে পারে।
কোডি গ্রে

1
@ কোডি গ্রে: সম্মত হয়েছেন, উদাহরণটি যেমন ক্ষুদ্র is এটি অতিরিক্ত কোড 'শোরগোল' এরকম একটি অস্বাভাবিক (একটি সি # পিওভি থেকে) পদ্ধতির কল করে প্রবর্তিত যা আমি এড়াতে আগ্রহী। একটি সুসংগঠিত দলে এই জাতীয় জিনিসগুলি যাইহোক কোড পর্যালোচনাতে নেওয়া হবে এবং সহজেই এড়ানো যায়। বিটিডাব্লু - আমি VB6 / VB.NET আক্রমণ করার চেষ্টা করছি না। আমি 'অদ্ভুত' শুধুমাত্র কারণ একটি .NET অপেশাদার থেকে, করার কোনো কারণ যেমন পদ্ধতি বর্ণিত DateAndTime.Year()যে অস্তিত্ব দেওয়া DateTimeএকটি আছে Yearসম্পত্তি। এটি কেবলমাত্র ভিবি.এন.ই.টি. কে আরও ভিবি 6 এর মতো প্রদর্শিত হওয়ার জন্য বিদ্যমান। প্রাক্তন ভিবি 6 প্রোগ্রামার হিসাবে, আমি এটির প্রশংসা করতে পারি ;-)
অ্যাডাম রাল্ফ

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 যুক্ত করবেন? এই উত্তরটি কে ভোট দিচ্ছে: - /?
পল

অভিন্ন তারিখগুলির জন্য, এটি আউটপুট ১ হিসাবে দেবে ically মূলত, এটি সমস্ত মাসগুলিকে অন্তর্ভুক্ত শুরু এবং শেষের মাস গণনা করবে।
চিড়াগ

3
আমার কাছে দুটি আইটেমের পার্থক্যের মতো শোনাচ্ছে না। 2 এবং 2 এর মধ্যে পার্থক্য কী? আসলেই কি 1? আমি পার্থক্যটি 0 এর পরামর্শ দিচ্ছি
পল


7

আমার কেবলমাত্র কর্মসংস্থান তারিখগুলি পূরণ করার জন্য সহজ কিছু দরকার ছিল যেখানে কেবলমাত্র মাস / বছর প্রবেশ করা হয়, তাই স্বতন্ত্র বছর এবং মাসগুলি কাজ করতে চেয়েছিল This আমি এখানে ব্যবহার করি কেবলমাত্র ব্যবহারের জন্য

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

.নাইট ফিডল


4

আপনি নেট নেট সময়কালের জন্য টাইম পিরিয়ড লাইব্রেরির ডেটডিফ ক্লাস ব্যবহার করতে পারেন :

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

আপনি ডিফফ্লস নামে আরেকটি পদ্ধতি তৈরি করতে পারেন এবং উপরের মতো ঠিক একই যুক্তি প্রয়োগ করতে পারবেন এবং লুপের মধ্যে অ্যাডমোথনের পরিবর্তে অ্যাডস অ্যাডস যুক্ত করুন।


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 তম থেকে এটি দ্বিতীয় মাস শুরু হয়েছে।

আপনি যদি দ্বিতীয় অবস্থাতে "=" মুছে ফেলতে পারেন তবে যদি আপনি উভয় দিন গণনায় অন্তর্ভুক্ত না করতে চান। অর্থাত, 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

শুধুমাত্র বছর, মাস, দিনের জন্য ভিবি নেট নেটডিফ ব্যবহার করে এখানে আরও সংক্ষিপ্ত সমাধান দেওয়া হয়েছে। আপনি সি # তে ডেটডিফ লাইব্রেরিও লোড করতে পারেন।

তারিখ 1 অবশ্যই <= তারিখ 2 হবে

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

এটি কર્ક ওলের উত্তরের প্রতিক্রিয়া। একটি মন্তব্যে জবাব দেওয়ার মতো পর্যাপ্ত খ্যাতি পয়েন্ট আমার কাছে নেই ...

আমি কર્કের সমাধানটি পছন্দ করেছিলাম এবং নির্লজ্জভাবে এটি ছিঁড়ে ফেলতে এবং এটি আমার কোডে ব্যবহার করতে যাচ্ছিলাম, কিন্তু যখন আমি এটি দেখলাম তখন বুঝতে পারলাম যে এটি খুব জটিল। অপ্রয়োজনীয় স্যুইচিং এবং লুপিং, এবং এমন পাবলিক কনস্ট্রাক্টর যা ব্যবহার করার জন্য অর্থহীন।

এখানে আমার পুনর্লিখন:

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

আমার ক্ষেত্রে এটি পরবর্তী মাসের প্রথম দিন থেকে মাসের শুরু থেকে শুরু করে মাসের শুরু থেকে শুরু করার দিন থেকে পুরো মাস গণনা করা দরকার।



উদাহরণস্বরূপ: 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());
}

দয়া করে ইংরেজিতে উত্তর দিন (বনাম কোনও উদ্ভাবিত ভাষা ...)
ক্লিওপেট্রা

কেন শুধু স্টার্টডেট.এডডমুনথস (মাসিকাউন্ট) করবেন না? টোশোর্টডেটস্ট্রিং ()? এটি যেভাবেই জিজ্ঞাসা করা হয়েছিল মূল প্রশ্নের উত্তর দেয় না!
ট্যাবকুল

ওহ, দুঃখিত @ ট্যাবিকুল, এই কোডটি আমার প্রোগ্রামে ভাল কাজ করে! প্রোগ্রামারদের বিধি বলে: প্রথম কোড কাজ করে এবং তারপরে অপ্টিমাইজেশন! আপনার মন্তব্যের জন্য টানেক্স :)
রেজা আখলাগী

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

উপরে করা দুর্দান্ত ডেটটাইমস্প্যান কাজের উপর ভিত্তি করে, আমি কোডটি কিছুটা স্বাভাবিক করেছি; এটি বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে:

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 টি তারিখের মধ্যে পার্থক্য গণনা করতে সক্ষম হওয়াই একটি সম্পূর্ণ যুক্তিযুক্ত জিনিস, এবং এটি অনেক ব্যবসায়িক অ্যাপ্লিকেশনগুলিতে প্রয়োজন is এখানে বেশ কয়েকটি কোডার যারা মতামত দিয়েছেন - "মে 1,2010" এবং "জুন 16,2010 এর মধ্যে কয়েক মাসের মধ্যে পার্থক্য কী, 31 ডিসেম্বর 2010 এবং 1 জানুয়ারী 2011 এর মধ্যে কয়েক মাসের মধ্যে পার্থক্য কী? - বুঝতে ব্যর্থ হয়েছেন ব্যবসায়িক অ্যাপ্লিকেশনগুলির খুব বেসিক।

উপরোক্ত 2 টি মন্তব্যের জবাব এখানে - 1 মে -2010 এবং 16-জুন-2010-এর মধ্যে মাসের সংখ্যা 1 মাস, 31-ডিসেম্বর -2010 এবং 1-জানু -2011-এর মধ্যে মাসের সংখ্যা 0। এটি উপরের কোডাররা যেভাবে পরামর্শ দিয়েছেন, সেগুলি তাদের 1.5 মাস এবং 1 সেকেন্ড হিসাবে গণনা করা খুব বোকামি হবে।

ক্রেডিট কার্ড, বন্ধক প্রক্রিয়াকরণ, কর প্রক্রিয়াকরণ, ভাড়া প্রক্রিয়াকরণ, মাসিক সুদের গণনা এবং বিভিন্ন ধরণের অন্যান্য ব্যবসায়ের সমাধানগুলিতে কাজ করেছেন এমন লোকেরা সম্মত হবে।

সমস্যা হ'ল এই জাতীয় ফাংশনটি সি # বা VB.NET এর জন্য অন্তর্ভুক্ত নয়। ডেটেডিফ কেবল বছর বছর বা মাসের উপাদান বিবেচনায় নেয় তাই আসলে অকেজো।

এখানে আপনার আসল জীবনের কয়েকটি উদাহরণ রয়েছে যেখানে আপনাকে প্রয়োজন এবং সঠিকভাবে মাস গণনা করতে পারে:

আপনি 18-ফেব থেকে 23-আগস্ট পর্যন্ত একটি স্বল্পমেয়াদী ভাড়া থাকতেন। আপনি কত মাস সেখানে ছিলেন? উত্তরটি একটি সহজ - 6 মাস

আপনার একটি ব্যাঙ্কের অ্যাকাউন্ট রয়েছে যেখানে প্রতি মাসের শেষে সুদের গণনা করা হয় এবং অর্থ প্রদান করা হয়। আপনি 10-জুনে টাকা জমা দিন এবং 29-অক্ট (একই বছর) এ নিয়ে যান। আপনি কত মাসের জন্য আগ্রহ পান? খুব সহজ উত্তর- 4 মাস (আবার অতিরিক্ত দিনগুলি কিছু যায় আসে না)

ব্যবসায়িক অ্যাপ্লিকেশনগুলিতে, বেশিরভাগ সময়, যখন আপনাকে মাস গণনা করা দরকার, কারণ এটি কীভাবে মানুষ সময়কে গণনা করে তার ভিত্তিতে আপনাকে 'পূর্ণ' মাসগুলি জানতে হবে; কিছু বিমূর্ত / অপ্রাসঙ্গিক চিন্তার উপর ভিত্তি করে না।


5
অ্যাকাউন্টিং গণিত না হওয়ার এটি অন্যতম কারণ। অ্যাকাউন্টিংয়ে ফলাফলটি আপনি যেভাবে গণনা করছেন তার উপর নির্ভর করে .. আমি আপনার বিষয়গুলি জানি এবং আমি এটিতে "সাধারণ ব্যবসায়ের দৃষ্টিভঙ্গি" জানি তবে এই ব্যাখ্যাটি স্পষ্টতই ভুল। আপনি যা চেয়েছিলেন তার উপর নির্ভর করে ২০১২.১১.৩০ এবং ২০১২.১২.০১ এর মধ্যে 0, বা 1/30, বা 1/31, বা 1 বা 2 মাস রয়েছে । তারিখগুলি কি ব্যতিক্রমী বা অন্তর্ভুক্ত ছিল? আপনি কি কয়েক মাস অতিক্রম করেছেন, স্পর্শ করেছেন, বা পেরিয়েছেন? আপনি কি রাউন্ড-আপ, রাউন্ড-ডাউন, বা সঠিকটি চান?
কোয়েটজলক্যাটল

3
এখন এটি কোনও ব্যবসায়িক লোক বা অ্যাকাউন্ট্যান্টকে ব্যাখ্যা করুন এবং তারা আপনাকে একটি বিভ্রান্ত চেহারা দেবে। এটি সর্বদা "তাদের কাছে এতটাই স্পষ্ট যে তারা অবশ্যই X এবং Y এবং Z এর অর্থ বোঝায়, আপনি কীভাবে আলাদাভাবে চিন্তা করতে পারেন?" এখন বেশ কয়েকজন ব্যবসায়ী-লোক পান এবং তাদের এই বিষয়ে সম্মত হওয়ার চেষ্টা করুন। হিসাবরক্ষকরা রাজি হওয়ার সম্ভাবনা বেশি থাকে, কারণ এক পর্যায়ে তারা গণিত ব্যবহার করবেন যেগুলি বিকল্পগুলির সাথে একই সময়ে দু'বার একই সময়ের জন্য উপযুক্ত বিকল্পগুলি যাচাই করতে পারে etc. ইত্যাদি। এমনকি আপনার গণনার উদাহরণগুলি বিতর্কিত এবং অঞ্চল-নির্ভর, বা তারা ধরে নিলে স্পষ্টতই অবৈধ are অতিরিক্ত দিনগুলি উপেক্ষা করার মতো অতিরিক্ত ব্যবসার নিয়ম।
কোয়েটজলক্যাটল

2
-1 আপনি ধরে নিচ্ছেন যে সমস্ত সফ্টওয়্যার একটি "ব্যবসায়িক অ্যাপ্লিকেশন"। প্রশ্নে কোডটির উদ্দেশ্য উল্লেখ করা হয়নি। আপনি ধরে নিন যে সমস্ত "ব্যবসায়িক অ্যাপ্লিকেশনগুলি" একই নিয়ম রয়েছে, যা অবশ্যই সত্য নয়।
জেসি ওয়েব

0

টোস্ট্রিং (ফর্ম্যাট) এবং সময়কাল (দীর্ঘ এমএস) সহ প্রসারিত কার্কস স্ট্রাক্ট

 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));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.