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


128

মধ্যে C # /। নেট TimeSpanহয়েছে TotalDays, TotalMinutesইত্যাদি কিন্তু আমি আউট মোট মাসের পার্থক্য একটি সূত্র জিনিসটা করতে পারবে না। প্রতি মাসে পরিবর্তনশীল দিন এবং লিপ বছরগুলি আমাকে ফেলে দেয়। টোটালমেন্থস আমি কীভাবে পেতে পারি ?

সম্পাদনা করুন দুঃখিত আরো স্পষ্ট না থাকায়: আমি আমি আসলে এই পেতে পারে না জানেন TimeSpanকিন্তু আমি ব্যবহার চিন্তা TotalDaysএবং TotalMinutesআমি যা খুঁজছেন হয় ... ব্যতীত আমি মোট মাস পেতে চেষ্টা করছি প্রকাশ করার একটি ভাল উদাহরণ হতে পারে।

উদাহরণ: 25 ডিসেম্বর, 2009 - 6 অক্টোবর, 2009 = 2 মোট মাস। অক্টোবর 6 থেকে নভেম্বর 5 সমান 0 মাস। নভেম্বর 6, 1 মাস। 6 ডিসেম্বর, 2 মাস


2
25 ডিসেম্বর, 2009 - 6 অক্টোবর, 2009 আপনি কী প্রত্যাশা করছেন?
জেফ মোসর 14

2
আপনি মাসগুলিতে টাইমস্প্যানকে কীভাবে সংজ্ঞায়িত করবেন?
আলিওস্তাদ

1
@ আলিওস্তাদ - তারিখ ব্যতীত আপনি একটি মাসকে 30 দিন হিসাবে সংজ্ঞায়িত করতে পারেন এবং বেশ নির্ভুল হতে পারেন।
কেওসপ্যান্ডিয়ন

এটি কোনও কারণে কোনও কারণে এই প্রশ্নের সাথে একীভূত হয়েছিল।
জমিয়েক

আসলে, তোমার দর্শন লগ করা আমার পোস্ট এখানে, যা এই প্রশ্নের উত্তর & A কোডেড সমাধান প্রদান পড়া প্রয়োজন, stackoverflow.com/questions/1916358/... supercat সঙ্গে মন্তব্যের মাধ্যমে আমার কথোপকথনে দানব (brianary) & বেতন মনোযোগ উপেক্ষা করি। যে মাসগুলি "টাইমস্প্যান" শুরু করার সময় শুরু হয়েছিল এবং শেষে আমরা "এতিম মাস" বলি, এবং প্রশ্ন আসে যে এই অনাথ মাসগুলিকে কীভাবে দিবসের নিরিখে সংজ্ঞা দেওয়া যায় - একবার আপনি নির্ধারণ করে ফেলেছেন যে (এবং আপনি কীভাবে এটি সংজ্ঞায়িত করতে চান ), বাকীটি কেবল কোড (যা অন্তর্ভুক্ত রয়েছে)। আমার Def আমার ব্যবহারকারীরা যা আশা করবেন তার উপর ভিত্তি করে
Erx_VB.NExT.Coder

উত্তর:


222

আপনি এটি একটি থেকে পাবেন না TimeSpan, কারণ একটি "মাস" পরিমাপের একটি পরিবর্তনশীল একক। আপনাকে এটি নিজেই গণনা করতে হবে এবং আপনি ঠিক কীভাবে এটি কাজ করতে চান তা নির্ধারণ করতে হবে।

উদাহরণস্বরূপ, তারিখগুলি কি এক মাস বা শূন্য মাসের পার্থক্যের মতো হবে July 5, 2009এবং August 4, 2009ফলন করবে? আপনি যদি বলেন যে এটির একটি ফলন করা উচিত, তবে কী July 31, 2009এবং August 1, 2009কী? কি যে এক মাসে? এটি কি কেবল Monthখেজুরের মানগুলির পার্থক্য , বা এটি সময়ের সাথে সম্পর্কিত কিছু বেশি? এই সমস্ত নিয়ম নির্ধারণের জন্য যুক্তি তুচ্ছ নয়, সুতরাং আপনাকে নিজের নির্ধারণ করতে হবে এবং উপযুক্ত অ্যালগরিদমটি প্রয়োগ করতে হবে।

আপনি যা চান তা যদি কেবল মাসের মধ্যে একটি পার্থক্য হয় - সম্পূর্ণরূপে তারিখের মানগুলি উপেক্ষা করে - তবে আপনি এটি ব্যবহার করতে পারেন:

public static int MonthDifference(this DateTime lValue, DateTime rValue)
{
    return (lValue.Month - rValue.Month) + 12 * (lValue.Year - rValue.Year);
}

নোট করুন যে এটি একটি তুলনামূলক পার্থক্য প্রদান করে, এর অর্থ যদি এর rValueচেয়ে বড় lValueহয় তবে ফেরতের মানটি নেতিবাচক হবে। আপনি যদি পরম পার্থক্য চান, আপনি এটি ব্যবহার করতে পারেন:

public static int MonthDifference(this DateTime lValue, DateTime rValue)
{
    return Math.Abs((lValue.Month - rValue.Month) + 12 * (lValue.Year - rValue.Year));
}

আপনি যদি সত্যটি জানতে চান তবে @ দিনাহ এটি কেবল একটি আনুমানিকই onআমি এবং .ক্লসস - আপনি যা পড়তে পারেন তার জন্য আমি একটি উত্তর পোস্ট করেছি। যদিও, যতদূর অনুমান করা যায়, এটি একটি ভাল অনুমান (অ্যাডাম রবিনসনের কাছে প্রপস) তবে আপনার মনে রাখা উচিত যে আপনি যদি এই ধরণের কোনও অনুমান ব্যবহার করেন তবে আপনি অনিচ্ছাকৃতভাবে আপনার ব্যবহারকারীদের কাছে মিথ্যা কথা বলছেন।
এরেক্স_ভিবি.এনএক্সটি. কোডার

@ এরেক্স_ভিবি.এনএক্সটি ড। কোডার: প্রপসটির জন্য ধন্যবাদ, তবে আপনার উত্তরে বলা হয়েছে যে কোনও উত্তরই এই বিষয়টিকে গ্রহণ করে না যে এক মাস একটি পরিমাপের পরিবর্তনশীল একক হিসাবে বিবেচিত হয়, তবে মনে হয় তাদের বেশিরভাগই তা করেন; তারা কেবল আপনার নির্দিষ্ট অনুমান ব্যবহার করে না। ঘটনাচক্রে, আমার উত্তরের প্রথম বাক্যটি ইঙ্গিত করে যে এটি পরিবর্তনশীল। আপনার অন্তর্ভুক্ত থাকা কোনও উত্তর হ'ল একটি সান্নিধ্য , কেবল কারণ এটি কোনও সুনির্দিষ্ট উত্তর নয়। আপনার "2 মাস" ফলাফলের অর্থ বিভিন্ন ইনপুটগুলির জন্য বিভিন্ন জিনিস বোঝাতে পারে, সুতরাং এটি একটি আনুমানিক।
অ্যাডাম রবিনসন

আমার কোনও অনুমান নয় যদিও, আজ যদি ১৪ ই মার্চ হয়, তবে জানের মধ্যে ৩১ দিন ছিল এবং ফেবের ২৯ দিন তাড়াতাড়ি হয়েছে, এই ভিত্তিতে দুটি উদীয়মান মাস গণনা করা হয়। এখন, আপনি সঠিক যে আমার পদ্ধতিটি একটি "সাধারণ" মাসের সংজ্ঞা নয়, এবং আপনার! তবে, কেবলমাত্র আমার ক্ষেত্রে প্রযোজ্য যদি আপনি "এই মন্তব্যটি x মাস এবং y দিন এজিও পোস্ট করা হয়েছিল" এর মতো বিষয়গুলি রিপোর্ট করে থাকেন তবে "এজিও" অংশটি পার্থক্য করে, কারণ এটি পূর্ববর্তী x মাসগুলিতে উল্লেখ করে, সেই আগের x মাসগুলি গণনা করা দরকার এই এক্স মাসে কত দিন উপস্থিত ছিল তার উপর ভিত্তি করে! লিংক ....
এরক্স_ভিবি.এনএক্সটি. কোডার

যে জানার জন্য? সুতরাং যদি আপনি নির্দিষ্ট, জ্ঞাত মাসগুলি উল্লেখ করে থাকেন তবে আমার পদ্ধতিটি 100% নির্ভুল এবং আপনি একটি আনুমানিকই হবেন, তবে আপনি যদি সাধারণভাবে কোনও মাসের কথা উল্লেখ করছেন তবে আপনি আনুমানিক একটি ভাল ধারণা হতে পারবেন, এবং আমার কেবল একটি খারাপ ধারণা হবে (এটি এর জন্য তৈরি হয়নি এবং এটি ব্যবহারে কোনও লাভ হবে না)। : এখানে আমার নিবন্ধটি লিংক সমস্যা বর্ণনা এবং একটি সমাধান প্রদান করে stackoverflow.com/questions/1916358/...
Erx_VB.NExT.Coder

2
এটি SQL সার্ভার ডেটডিফ (মাস, ...) ফাংশন দ্বারা ব্যবহৃত একই যুক্তি বলে মনে হচ্ছে। এটি অত্যন্ত সংক্ষিপ্ত এবং ব্যাখ্যা এবং বোঝার জন্য সহজ হওয়ার সুবিধাও রয়েছে। আমি এটি নীচে ব্যাখ্যা করব ... ক্যালেন্ডারে কত পৃষ্ঠাগুলি আপনাকে একটি তারিখ থেকে অন্য তারিখে যেতে হবে?
জোয়েলফ্যান

51

(আমি বুঝতে পারি এটি একটি পুরানো প্রশ্ন, তবে ...)

খাঁটি। নেট মধ্যে এটি তুলনামূলকভাবে বেদনাদায়ক। আমি আমার নিজস্ব নোডা টাইম লাইব্রেরিটি সুপারিশ করব যা বিশেষত এই জাতীয় জিনিসের জন্য ডিজাইন করা হয়েছে:

LocalDate start = new LocalDate(2009, 10, 6);
LocalDate end = new LocalDate(2009, 12, 25);
Period period = Period.Between(start, end);
int months = period.Months;

(অন্যান্য বিকল্প রয়েছে, যেমন আপনি যদি বছরের পর বছর জুড়ে কেবল কয়েক মাস চান তবে আপনি ব্যবহার করতে পারেন Period period = Period.Between(start, end, PeriodUnits.Months);)


আমি আপনার লাইব্রেরিটি ডাউনলোড করেছি এবং আপনি উপরে লিখেছেন এমন কোডটি অনুলিপি করেছি, তবে সংকলনের সময় ত্রুটিটি পাচ্ছি। ত্রুটি 1 অপারেটর '-' 'নোডাটাইম। লোকালডেট' এবং 'নোডাটাইম.লোক্যালডেট' প্রকারের অপারেন্ডগুলিতে প্রয়োগ করা যাবে না। আমি এই পোস্টটি 5 বছর থেকে জানি, সেই সময় থেকে কোনও কিছুর পরিবর্তন হয়েছিল, যা এই কোডটি কাজ করে না?
Hakan Fıstık

1
@ হকফস্টক: দুঃখিত - ২.০ প্রকাশিত হলে এটি কাজ করবে তবে ততক্ষণ আপনার ব্যবহারের প্রয়োজন Period.Between। কোডটি সম্পাদনা করেছেন যাতে এটি নোডটাইম 1.3.1 এর সাথে কাজ করবে।
জন স্কিটি

অনেক ধন্যবাদ নোডাটাইম লাইব্রেরি ঠিক তাই করলো যা আমি করতে চাই। আমি কেবল দুটি তারিখের মধ্যেই মাস নয়, বাকি দিনগুলিও গণনা করতে চেয়েছিলাম এবং নোডাটাইম ঠিক এই কাজটি করেছে, আবার ধন্যবাদ।
হাকান ফাস্টিক

1
@ জোনস্কিট আপনার লাইব্রেরিটি সত্যই কালো যাদু। তারিখগুলি আমাকে সর্বদা কামড় দেয়। এই কোড স্নিপেটটি আমাকে প্রচুর পরিমাণে সময় সাশ্রয় করেছে।
ওয়ানফুটসুইল

28

হতে পারে আপনি মাসের ভগ্নাংশ সম্পর্কে জানতে চান না; এই কোড সম্পর্কে কি?


public static class DateTimeExtensions
{
    public static int TotalMonths(this DateTime start, DateTime end)
    {
        return (start.Year * 12 + start.Month) - (end.Year * 12 + end.Month);
    }
}

//  Console.WriteLine(
//     DateTime.Now.TotalMonths(
//         DateTime.Now.AddMonths(-1))); // prints "1"



1
আমি 100% বুঝতে পারছি না। এটি * 12 হওয়া উচিত?
রাফেলস

9

টোটালম্যাথস দ্বারা শুরু করার জন্য আপনাকে কী বোঝাতে চাইছে তা আপনাকে নির্ধারণ করতে হবে।
একটি সাধারণ সংজ্ঞা একটি মাসকে 30.4 দিন (365.25 / 12) রাখে।

এর বাইরেও ভগ্নাংশ সহ যে কোনও সংজ্ঞা অকেজো বলে মনে হয় এবং আরও সাধারণ পূর্ণসংখ্যার মান (তারিখের মধ্যে পুরো মাস) অ-স্ট্যান্ডার্ড ব্যবসায়িক নিয়মের উপরও নির্ভর করে।


9

আমি এটি করতে DateTimeএবং DateTimeOffsetকরতে একটি খুব সহজ এক্সটেনশন পদ্ধতি লিখেছি । আমি চেয়েছিলাম এটি ঠিক কোনও TotalMonthsসম্পত্তির মতো কাজ করবেTimeSpan করবে: অর্থাত্ কোনও আংশিক মাস উপেক্ষা করে দুটি তারিখের মধ্যে সম্পূর্ণ মাসের গণনা ফিরিয়ে দিন। কারণ এটি এর উপর ভিত্তি করে DateTime.AddMonths()বিভিন্ন মাসের দৈর্ঘ্যকে সম্মান করে এবং মাসের একটি সময়কালে কোনও মানুষ কী বোঝবে তা ফিরিয়ে দেয়।

(দুর্ভাগ্যক্রমে আপনি এটি টাইমস্প্যানে একটি এক্সটেনশন পদ্ধতি হিসাবে প্রয়োগ করতে পারবেন না কারণ এটি ব্যবহৃত প্রকৃত তারিখগুলির জ্ঞান ধরে রাখে না এবং কয়েক মাস ধরে তারা গুরুত্বপূর্ণ))

কোড এবং পরীক্ষা উভয়ই গিটহাবে পাওয়া যায় on । কোডটি খুব সহজ:

public static int GetTotalMonthsFrom(this DateTime dt1, DateTime dt2)
{
    DateTime earlyDate = (dt1 > dt2) ? dt2.Date : dt1.Date;
    DateTime lateDate = (dt1 > dt2) ? dt1.Date : dt2.Date;

    // Start with 1 month's difference and keep incrementing
    // until we overshoot the late date
    int monthsDiff = 1;
    while (earlyDate.AddMonths(monthsDiff) <= lateDate)
    {
        monthsDiff++;
    }

    return monthsDiff - 1;
}

এবং এটি এই সমস্ত ইউনিট পরীক্ষার কেস পাস করে:

// Simple comparison
Assert.AreEqual(1, new DateTime(2014, 1, 1).GetTotalMonthsFrom(new DateTime(2014, 2, 1)));
// Just under 1 month's diff
Assert.AreEqual(0, new DateTime(2014, 1, 1).GetTotalMonthsFrom(new DateTime(2014, 1, 31)));
// Just over 1 month's diff
Assert.AreEqual(1, new DateTime(2014, 1, 1).GetTotalMonthsFrom(new DateTime(2014, 2, 2)));
// 31 Jan to 28 Feb
Assert.AreEqual(1, new DateTime(2014, 1, 31).GetTotalMonthsFrom(new DateTime(2014, 2, 28)));
// Leap year 29 Feb to 29 Mar
Assert.AreEqual(1, new DateTime(2012, 2, 29).GetTotalMonthsFrom(new DateTime(2012, 3, 29)));
// Whole year minus a day
Assert.AreEqual(11, new DateTime(2012, 1, 1).GetTotalMonthsFrom(new DateTime(2012, 12, 31)));
// Whole year
Assert.AreEqual(12, new DateTime(2012, 1, 1).GetTotalMonthsFrom(new DateTime(2013, 1, 1)));
// 29 Feb (leap) to 28 Feb (non-leap)
Assert.AreEqual(12, new DateTime(2012, 2, 29).GetTotalMonthsFrom(new DateTime(2013, 2, 28)));
// 100 years
Assert.AreEqual(1200, new DateTime(2000, 1, 1).GetTotalMonthsFrom(new DateTime(2100, 1, 1)));
// Same date
Assert.AreEqual(0, new DateTime(2014, 8, 5).GetTotalMonthsFrom(new DateTime(2014, 8, 5)));
// Past date
Assert.AreEqual(6, new DateTime(2012, 1, 1).GetTotalMonthsFrom(new DateTime(2011, 6, 10)));

3
দেহাতি তবে সেরা সমাধান। কপি এবং আটকানো। আপনাকে ধন্যবাদ
ড্যানিয়েল ডলজ

8

আপনার তারিখের সময় থেকে নিজেকে এটিকে কাজ করতে হবে। স্টাবের দিনগুলি আপনি কীভাবে ব্যবহার করবেন তার উপর নির্ভর করবে আপনি এটি কীভাবে ব্যবহার করতে চান will

একটি পদ্ধতি হ'ল মাস গণনা করা এবং তারপরে শেষের দিনগুলির জন্য সঠিক correct কিছুটা এইরকম:

   DateTime start = new DateTime(2003, 12, 25);
   DateTime end = new DateTime(2009, 10, 6);
   int compMonth = (end.Month + end.Year * 12) - (start.Month + start.Year * 12);
   double daysInEndMonth = (end - end.AddMonths(1)).Days;
   double months = compMonth + (start.Day - end.Day) / daysInEndMonth;

চমৎকার কোড, যদিও, 1 বাগ: পরিবর্তে: (28 ফেব্রুয়ারি হিসাবে + 1 মাস == ২৮ মার্চ) :-) // দশমিক দিনInEndMonth = (শেষ - শেষ A আমি প্রস্তাব দিচ্ছি: দশমিক দিনগুলিআইএনএন্ডমোন্ঠ = ডেটটাইম.ডাইসইমনমোথ (শেষ.ইয়ার, শেষ.মোনথ) * -1;
বেজিউর

3

আমি এটি এইভাবে করব:

static int TotelMonthDifference(this DateTime dtThis, DateTime dtOther)
{
    int intReturn = 0;

    dtThis = dtThis.Date.AddDays(-(dtThis.Day-1));
    dtOther = dtOther.Date.AddDays(-(dtOther.Day-1));

    while (dtOther.Date > dtThis.Date)
    {
        intReturn++;     
        dtThis = dtThis.AddMonths(1);
    }

    return intReturn;
}

4
এটি অবশ্যই একটি অ্যালগোরিটম, তবে এটি ব্যাপকভাবে সরল করা যেতে পারেreturn (dtOther.Month - dtThis.Month) + 12 * (dtOther.Year - dtThis.Year);
অ্যাডাম রবিনসন

1
দুটি সমস্যা: আপনি টাইমস্প্যান নয়, 2 তারিখ থেকে শুরু করছেন। দ্বিতীয়ত, আপনি উভয় মাসের 1 ম এর মধ্যে গণনা করুন, এটি খুব প্রশ্নবিদ্ধ সংজ্ঞা। যদিও এটি মাঝে মাঝে সঠিক হতে পারে।
হেন্ক হলটারম্যান

@ হেনক: হ্যাঁ, অবশ্যই এটি সর্বদা সঠিক নয়, এজন্যই আমি বলেছিলাম যে এটি আমি কীভাবে করব, কারও কীভাবে এটি করা উচিত নয়। ফলাফল কীভাবে গণনা করা উচিত তা ওপি নির্দিষ্ট করে দেয় না। @ অ্যাডাম: বাহ, আমি আবারও জটিলভাবে ভেবেছিলাম ... এটি আমার কাছে প্রায়শই ঘটে। মন্তব্যের জন্য ধন্যবাদ, আপনি স্পষ্টতই ঠিক বলেছেন, আপনার সংস্করণটি আরও ভাল। আমি এখন থেকে এটি ব্যবহার করব।
ম্যাক্সিমিলিয়ান মেয়ারল

@ অ্যাডাম: আপনি এটিকে প্রকৃত উত্তর হিসাবে জমা দিচ্ছেন না কেন ?! এটি এখন পর্যন্ত সবচেয়ে কমপ্যাক্ট। খুব চতুর।
দিনাহ 15

@ দিনাহ: আপনি আসলে যা চেয়েছিলেন তা আমি ধরে নিতে চাইনি। যদি এটি হয় তবে আমি এই পদ্ধতির অন্তর্ভুক্ত করার জন্য আমার পূর্ববর্তী উত্তরটি সম্পাদনা করেছি।
অ্যাডাম রবিনসন

3

এ সম্পর্কে খুব বেশি পরিষ্কার উত্তর নেই কারণ আপনি সর্বদা জিনিসকে ধরে নিচ্ছেন।

এই সমাধানটি তুলনার জন্য আপনি মাসের দিনটি সংরক্ষণ করতে চান এই ধরণের মধ্যে দুটি তারিখের মধ্যে মাস গণনা করে (অর্থাত্ মাসের দিন গণনায় বিবেচিত হয়)

উদাহরণস্বরূপ, আপনার যদি 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
}

3

আপনি পুরো মাস চাইলে গৃহীত উত্তরটি পুরোপুরি কার্যকর হয়।

আমার আংশিক মাস দরকার ছিল। আমি আংশিক মাস ধরে এই সমাধানটি নিয়ে এসেছি:

    /// <summary>
    /// Calculate the difference in months.
    /// This will round up to count partial months.
    /// </summary>
    /// <param name="lValue"></param>
    /// <param name="rValue"></param>
    /// <returns></returns>
    public static int MonthDifference(DateTime lValue, DateTime rValue)
    {
        var yearDifferenceInMonths = (lValue.Year - rValue.Year) * 12;
        var monthDifference = lValue.Month - rValue.Month;

        return yearDifferenceInMonths + monthDifference + 
            (lValue.Day > rValue.Day
                ? 1 : 0); // If end day is greater than start day, add 1 to round up the partial month
    }

আংশিক বছরের জন্য একই প্রয়োজনের সাথে আমারও এক বছরের পার্থক্য প্রয়োজন। সমাধানটি আমি এখানে নিয়ে এসেছি:

    /// <summary>
    /// Calculate the differences in years.
    /// This will round up to catch partial months.
    /// </summary>
    /// <param name="lValue"></param>
    /// <param name="rValue"></param>
    /// <returns></returns>
    public static int YearDifference(DateTime lValue, DateTime rValue)
    {
        return lValue.Year - rValue.Year +
               (lValue.Month > rValue.Month // Partial month, same year
                   ? 1
                   : ((lValue.Month = rValue.Month) 
                     && (lValue.Day > rValue.Day)) // Partial month, same year and month
                   ? 1 : 0);
    }

আপনার YearDifferenceফাংশনে লজিক বাগটি ছিল যখন lValue.Month < rValue.Month- আমি এখনই এটি স্থির করেছি, আপনি পর্যালোচনা করতে চাইতে পারেন ...
স্টোবার

2

পুরানো প্রশ্ন আমি জানি, তবে কারও সাহায্য করতে পারে। আমি উপরে @ অ্যাডাম স্বীকৃত উত্তরটি ব্যবহার করেছি, তবে তারপরে পার্থক্যটি 1 বা -1 হয় কিনা তা পরীক্ষা করে দেখুন তাহলে এটি পুরো ক্যালেন্ডারের মাসের পার্থক্য কিনা তা পরীক্ষা করে দেখুন। সুতরাং 21/07/55 এবং 20/08/55 পুরো মাস হবে না, তবে 21/07/55 এবং 21/07/55 হবে।

/// <summary>
/// Amended date of birth cannot be greater than or equal to one month either side of original date of birth.
/// </summary>
/// <param name="dateOfBirth">Date of birth user could have amended.</param>
/// <param name="originalDateOfBirth">Original date of birth to compare against.</param>
/// <returns></returns>
public JsonResult ValidateDateOfBirth(string dateOfBirth, string originalDateOfBirth)
{
    DateTime dob, originalDob;
    bool isValid = false;

    if (DateTime.TryParse(dateOfBirth, out dob) && DateTime.TryParse(originalDateOfBirth, out originalDob))
    {
        int diff = ((dob.Month - originalDob.Month) + 12 * (dob.Year - originalDob.Year));

        switch (diff)
        {
            case 0:
                // We're on the same month, so ok.
                isValid = true;
                break;
            case -1:
                // The month is the previous month, so check if the date makes it a calendar month out.
                isValid = (dob.Day > originalDob.Day);
                break;
            case 1:
                // The month is the next month, so check if the date makes it a calendar month out.
                isValid = (dob.Day < originalDob.Day);
                break;
            default:
                // Either zero or greater than 1 month difference, so not ok.
                isValid = false;
                break;
        }
        if (!isValid)
            return Json("Date of Birth cannot be greater than one month either side of the date we hold.", JsonRequestBehavior.AllowGet);
    }
    else
    {
        return Json("Date of Birth is invalid.", JsonRequestBehavior.AllowGet);
    }
    return Json(true, JsonRequestBehavior.AllowGet);
}

2
case IntervalType.Month:
    returnValue = start.AddMonths(-end.Month).Month.ToString();
    break;
case IntervalType.Year:
    returnValue = (start.Year - end.Year).ToString();
    break;

2
কোডটি নিয়ে যাওয়ার একটি বিবরণ অন্যান্য পাঠকদের জন্যও উপকারী হবে।
বোকেকেম

হ্যাঁ দয়া করে কিছু ভাষ্য যুক্ত করুন।
আমার

1

মাসগুলির সমস্যা হ'ল এটি আসলে কোনও সাধারণ পরিমাপ নয় - এগুলি ধ্রুব আকার নয়। আপনি যা অন্তর্ভুক্ত করতে চান তার জন্য আপনাকে আপনার বিধিগুলি নির্দিষ্ট করতে হবে এবং সেখান থেকে কাজ করতে হবে। উদাহরণস্বরূপ 1 জানুয়ারি থেকে 1 ফেব্রুয়ারি - আপনি যুক্তি দিতে পারেন 2 মাস সেখানে জড়িত রয়েছে, বা আপনি বলতে পারেন যে এটি এক মাস। তারপরে "1 জানুয়ারী 20:00" থেকে "1 ফেব্রুয়ারী 00:00" - এটি পুরো পুরো মাস নয়। এটা কি 0? 1? (1 জানুয়ারী 00:00 থেকে 1 ফেব্রুয়ারী 20:00) ... 1 এর অন্যদিকে কী হবে? 2?

প্রথমে নিয়মগুলি সংজ্ঞায়িত করুন, তারপরে আপনার নিজের কোড করতে হবে, আমি ভয় পাচ্ছি ...


1

আপনি যদি একটি ফলাফল আছে করতে চান তাহলে 1মধ্যে 28th Febএবং 1st March:

DateTime date1, date2;
int monthSpan = (date2.Year - date1.Year) * 12 + date2.Month - date1.Month

এটি SQL সার্ভার ডেটডিফ (মাস, ...) ফাংশন দ্বারা ব্যবহৃত একই যুক্তি বলে মনে হচ্ছে। এটি অত্যন্ত সংক্ষিপ্ত এবং ব্যাখ্যা এবং বোঝার জন্য সহজ হওয়ার সুবিধাও রয়েছে। আমি এটি নীচে ব্যাখ্যা করব ... ক্যালেন্ডারে কত পৃষ্ঠাগুলি আপনাকে একটি তারিখ থেকে অন্য তারিখে যেতে হবে?
জোয়েলফ্যান

1

এই লাইব্রেরিটি ডেটটাইমের সমস্ত অংশ বিবেচনা করে মাসের পার্থক্য গণনা করে:

// ----------------------------------------------------------------------
public void DateDiffSample()
{
  DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
  Console.WriteLine( "Date1: {0}", date1 );
  // > Date1: 08.11.2009 07:13:59
  DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
  Console.WriteLine( "Date2: {0}", date2 );
  // > Date2: 20.03.2011 19:55:28

  DateDiff dateDiff = new DateDiff( date1, date2 );

  // differences
  Console.WriteLine( "DateDiff.Years: {0}", dateDiff.Years );
  // > DateDiff.Years: 1
  Console.WriteLine( "DateDiff.Quarters: {0}", dateDiff.Quarters );
  // > DateDiff.Quarters: 5
  Console.WriteLine( "DateDiff.Months: {0}", dateDiff.Months );
  // > DateDiff.Months: 16
  Console.WriteLine( "DateDiff.Weeks: {0}", dateDiff.Weeks );
  // > DateDiff.Weeks: 70
  Console.WriteLine( "DateDiff.Days: {0}", dateDiff.Days );
  // > DateDiff.Days: 497
  Console.WriteLine( "DateDiff.Weekdays: {0}", dateDiff.Weekdays );
  // > DateDiff.Weekdays: 71
  Console.WriteLine( "DateDiff.Hours: {0}", dateDiff.Hours );
  // > DateDiff.Hours: 11940
  Console.WriteLine( "DateDiff.Minutes: {0}", dateDiff.Minutes );
  // > DateDiff.Minutes: 716441
  Console.WriteLine( "DateDiff.Seconds: {0}", dateDiff.Seconds );
  // > DateDiff.Seconds: 42986489

  // elapsed
  Console.WriteLine( "DateDiff.ElapsedYears: {0}", dateDiff.ElapsedYears );
  // > DateDiff.ElapsedYears: 1
  Console.WriteLine( "DateDiff.ElapsedMonths: {0}", dateDiff.ElapsedMonths );
  // > DateDiff.ElapsedMonths: 4
  Console.WriteLine( "DateDiff.ElapsedDays: {0}", dateDiff.ElapsedDays );
  // > DateDiff.ElapsedDays: 12
  Console.WriteLine( "DateDiff.ElapsedHours: {0}", dateDiff.ElapsedHours );
  // > DateDiff.ElapsedHours: 12
  Console.WriteLine( "DateDiff.ElapsedMinutes: {0}", dateDiff.ElapsedMinutes );
  // > DateDiff.ElapsedMinutes: 41
  Console.WriteLine( "DateDiff.ElapsedSeconds: {0}", dateDiff.ElapsedSeconds );
  // > DateDiff.ElapsedSeconds: 29
} // DateDiffSample

1

নীচে আসলে আপনি এটি করতে পারেন সবচেয়ে নিখুঁত উপায়, যেহেতু "1 মাস" সংজ্ঞাটি এটি কোন মাসের উপর নির্ভর করে পরিবর্তিত হয় এবং অন্যান্য উত্তরগুলির মধ্যে এটি এটিকে বিবেচনায় রাখে না! ফ্রেমওয়ার্কে তৈরি না হওয়া ইস্যু সম্পর্কে আপনি যদি আরও তথ্য চান তবে আপনি এই পোস্টটি পড়তে পারেন: রিয়েল টাইমস্প্যান অবজেক্ট উইথ .সালস এবং .মেন্থস (তবে, পোস্টটি নীচের ফাংশনটি বুঝতে এবং ব্যবহার করার প্রয়োজন নেই, এটি অন্যদের ব্যবহার করতে পছন্দ করে এমন আনুষঙ্গিক ভুলগুলি ছাড়াই 100% কাজ করে - এবং অন্তর্নির্মিতের সাথে রিভার্সিট ফাংশনটি প্রতিস্থাপন করতে নির্দ্বিধায় থাকে। আপনার ফ্রেমওয়ার্কটিতে আপনার বিপরীত ফাংশন থাকতে পারে (এটি সম্পূর্ণতার জন্য এখানেই রয়েছে)।

দয়া করে মনে রাখবেন যে আপনি বছরের পর বছর যে কোনও তারিখ / বারের যথার্থতা, সেকেন্ড এবং মিনিট, বা সেকেন্ড, মিনিট এবং দিনগুলি পেতে পারেন (যার মধ্যে 6 অংশ / বিভাগ থাকবে)। আপনি যদি শীর্ষ দুটি উল্লেখ করেন এবং এটি এক বছরেরও বেশি পুরানো হয় তবে এটি "1 বছর 3 মাস আগে" ফিরে আসবে এবং বাকীটি ফিরিয়ে দেবে না কারণ আপনি দুটি বিভাগের জন্য অনুরোধ করেছেন। যদি এটি কয়েক ঘন্টা পুরানো হয় তবে এটি কেবল "2 ঘন্টা 1 মিনিট আগে" ফিরে আসবে। অবশ্যই, যদি আপনি 1, 2, 3, 4, 5 বা 6 সেগমেট নির্দিষ্ট করেন (একই সাথে সেকেন্ড, মিনিট, ঘন্টা, দিন, মাস, বছর কেবল 6 প্রকার তৈরি করে) তবে 6 বা 6 সেগমেট নির্দিষ্ট করে যদি একই নিয়মগুলি প্রযোজ্য। এটি "মিনিট" বনাম "মিনিট" এর মতো ব্যাকরণের সমস্যাগুলিও ঠিক করে দেবে যদি এটি 1 মিনিট বা তারও বেশি, সব ধরণের জন্য একই রকম হয় এবং উত্পন্ন "স্ট্রিং" সর্বদা ব্যাকরণগতভাবে সঠিক থাকে।

এখানে ব্যবহারের জন্য কয়েকটি উদাহরণ দেওয়া হয়েছে: বিএলসলেগমেন্টগুলি সনাক্ত করতে পারে যে কতগুলি বিভাগ দেখানো হবে ... যেমন: যদি 3 হয়, তবে রিটার্ন স্ট্রিংটি হবে (উদাহরণস্বরূপ) ... "3 years, 2 months and 13 days"(শীর্ষ 3 বার হিসাবে ঘন্টা, মিনিট এবং সেকেন্ড অন্তর্ভুক্ত থাকবে না ) বিভাগগুলি ফেরত দেওয়া হয়েছে), তবে, তারিখটি একটি নতুন তারিখ ছিল, যেমন কিছু দিন আগে কিছু একই বিভাগগুলি (3) উল্লেখ করে ফিরে আসবে"4 days, 1 hour and 13 minutes ago" পরিবর্তে , সুতরাং এটি সমস্ত কিছু বিবেচনায় নেয়!

যদি বিলেস বিভাগগুলি 2 হয় তবে এটি ফিরে আসবে "3 years and 2 months"এবং যদি 6 (সর্বাধিক মান) ফিরে আসে "3 years, 2 months, 13 days, 13 hours, 29 minutes and 9 seconds"তবে মনে করিয়ে দেওয়া হবে যে এটি এর NEVER RETURNমতো কিছু হবে"0 years, 0 months, 0 days, 3 hours, 2 minutes and 13 seconds ago" শীর্ষস্থানীয় 3 বিভাগগুলিতে কোনও তারিখের ডেটা নেই এবং এগুলি উপেক্ষা করে আপনি 6 বিভাগগুলি নির্দিষ্ট করে থাকলেও , তাই চিন্তা করবেন না :)। অবশ্যই, যদি এর সাথে 0 এর সাথে কোনও সেগমেন্ট থাকে, তবে স্ট্রিংটি গঠনের সময় এটি বিবেচনায় নেবে "3 days and 4 seconds ago"এবং "0 ঘন্টা" অংশ হিসাবে প্রদর্শিত হবে এবং উপেক্ষা করবে! উপভোগ করুন এবং ভাল লাগলে মন্তব্য করুন।

 Public Function RealTimeUntilNow(ByVal dt As DateTime, Optional ByVal bAllowSegments As Byte = 2) As String
  ' bAllowSegments identifies how many segments to show... ie: if 3, then return string would be (as an example)...
  ' "3 years, 2 months and 13 days" the top 3 time categories are returned, if bAllowSegments is 2 it would return
  ' "3 years and 2 months" and if 6 (maximum value) would return "3 years, 2 months, 13 days, 13 hours, 29 minutes and 9 seconds"
  Dim rYears, rMonths, rDays, rHours, rMinutes, rSeconds As Int16
  Dim dtNow = DateTime.Now
  Dim daysInBaseMonth = Date.DaysInMonth(dt.Year, dt.Month)

  rYears = dtNow.Year - dt.Year
  rMonths = dtNow.Month - dt.Month
  If rMonths < 0 Then rMonths += 12 : rYears -= 1 ' add 1 year to months, and remove 1 year from years.
  rDays = dtNow.Day - dt.Day
  If rDays < 0 Then rDays += daysInBaseMonth : rMonths -= 1
  rHours = dtNow.Hour - dt.Hour
  If rHours < 0 Then rHours += 24 : rDays -= 1
  rMinutes = dtNow.Minute - dt.Minute
  If rMinutes < 0 Then rMinutes += 60 : rHours -= 1
  rSeconds = dtNow.Second - dt.Second
  If rSeconds < 0 Then rSeconds += 60 : rMinutes -= 1

  ' this is the display functionality
  Dim sb As StringBuilder = New StringBuilder()
  Dim iSegmentsAdded As Int16 = 0

  If rYears > 0 Then sb.Append(rYears) : sb.Append(" year" & If(rYears <> 1, "s", "") & ", ") : iSegmentsAdded += 1
  If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn

  If rMonths > 0 Then sb.AppendFormat(rMonths) : sb.Append(" month" & If(rMonths <> 1, "s", "") & ", ") : iSegmentsAdded += 1
  If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn

  If rDays > 0 Then sb.Append(rDays) : sb.Append(" day" & If(rDays <> 1, "s", "") & ", ") : iSegmentsAdded += 1
  If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn

  If rHours > 0 Then sb.Append(rHours) : sb.Append(" hour" & If(rHours <> 1, "s", "") & ", ") : iSegmentsAdded += 1
  If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn

  If rMinutes > 0 Then sb.Append(rMinutes) : sb.Append(" minute" & If(rMinutes <> 1, "s", "") & ", ") : iSegmentsAdded += 1
  If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn

  If rSeconds > 0 Then sb.Append(rSeconds) : sb.Append(" second" & If(rSeconds <> 1, "s", "") & "") : iSegmentsAdded += 1

parseAndReturn:

  ' if the string is entirely empty, that means it was just posted so its less than a second ago, and an empty string getting passed will cause an error
  ' so we construct our own meaningful string which will still fit into the "Posted * ago " syntax...

  If sb.ToString = "" Then sb.Append("less than 1 second")

  Return ReplaceLast(sb.ToString.TrimEnd(" ", ",").ToString, ",", " and")

 End Function

অবশ্যই, আপনার একটি "রিপ্লেসলাস্ট" ফাংশন প্রয়োজন হবে, যা উত্সের স্ট্রিং গ্রহণ করে এবং একটি যুক্তি যা প্রতিস্থাপন করতে হবে তা নির্দিষ্ট করে এবং অন্যটি যুক্তি যা আপনি এটির সাথে প্রতিস্থাপন করতে চান তা নির্দিষ্ট করে এবং এটি কেবল সেই স্ট্রিংয়ের শেষ ঘটনাটি প্রতিস্থাপন করে ... আমি আপনার একটিকে অন্তর্ভুক্ত করেছি যদি আপনার কাছে এটি না থাকে বা এটি বাস্তবায়ন করতে না চান, সুতরাং এটি এখানে, কোনও সংশোধন প্রয়োজন না করে এটি "যেমন আছে" কাজ করবে। আমি জানি রিভারসিট ফাংশনটির আর প্রয়োজন নেই (নেট এ বিদ্যমান) তবে রিপ্লেসলাস্ট এবং রিভার্সআইট ফানক প্রাক -.net দিন থেকে চালিত হয়, সুতরাং অনুগ্রহ করে এটি কীভাবে তারিখী হতে পারে তা ক্ষমা করবেন (এখনও 100% কাজ করে, ব্যবহার করা হচ্ছে) তাদের দশ বছরেরও বেশি সময় ধরে, তারা বাগ মুক্ত থাকার গ্যারান্টি দিতে পারে) ... :)। চিয়ার্স।

<Extension()> _ 
Public Function ReplaceLast(ByVal sReplacable As String, ByVal sReplaceWhat As String, ByVal sReplaceWith As String) As String 
    ' let empty string arguments run, incase we dont know if we are sending and empty string or not. 
    sReplacable = sReplacable.ReverseIt 
    sReplacable = Replace(sReplacable, sReplaceWhat.ReverseIt, sReplaceWith.ReverseIt, , 1) ' only does first item on reversed version! 
    Return sReplacable.ReverseIt.ToString 
End Function 

<Extension()> _ 
Public Function ReverseIt(ByVal strS As String, Optional ByVal n As Integer = -1) As String 
    Dim strTempX As String = "", intI As Integer 

    If n > strS.Length Or n = -1 Then n = strS.Length 

    For intI = n To 1 Step -1 
        strTempX = strTempX + Mid(strS, intI, 1) 
    Next intI 

    ReverseIt = strTempX + Right(strS, Len(strS) - n) 

End Function 

0

আপনি যদি সঠিক সংখ্যাটি চান তবে আপনি কেবল টাইমস্প্যান থেকে পারবেন না, যেহেতু আপনার জানা উচিত যে আপনি কোন মাসগুলি কাটাচ্ছেন এবং আপনি যেমন লিপ বর্ষটি নিয়ে কাজ করছেন কিনা you

হয় আনুমানিক সংখ্যার জন্য যান, বা আসল ডেটটাইমগুলির সাথে কিছু ফিরিয়ে দিন do


0

http://www.astro.uu.nl/~strous/AA/en/reken/juliaansedag.html

আপনি যদি কোনও গ্রেগরিয়ান তারিখ থেকে জুলিয়ান ডে সংখ্যায় রূপান্তরিত সময়টি পেতে পারেন তবে আপনি কেবল জুলিয়ান দিবসের সাথে তুলনা করার জন্য একটি অপারেটর তৈরি করতে পারেন, যা মাস, দিন, সেকেন্ড, ইত্যাদি পেতে দ্বিগুণ টাইপ হতে পারে উপরেরটি দেখুন গ্রেগরিয়ান থেকে জুলিয়ান রূপান্তর করার জন্য একটি অ্যালগরিদমের লিঙ্ক।



0

আপনি যদি মাস এবং বছর নিয়ে কাজ করছেন তবে আপনার এমন কিছু দরকার যা জানে যে প্রতি মাসে কত দিন থাকে এবং কোন বছরগুলি লিপ বছর years

গ্রেগরিয়ান ক্যালেন্ডার (এবং অন্যান্য সংস্কৃতি-নির্দিষ্ট ক্যালেন্ডার প্রবেশ করান বাস্তবায়ন) ।

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

DateTime AddWeeks(DateTime time, int weeks)
DateTime AddMonths(DateTime time, int months)
DateTime AddYears(DateTime time, int years)

0
DateTime start = new DateTime(2003, 12, 25);
DateTime end = new DateTime(2009, 10, 6);
int compMonth = (end.Month + end.Year * 12) - (start.Month + start.Year * 12);
double daysInEndMonth = (end - end.AddMonths(1)).Days;
double months = compMonth + (start.Day - end.Day) / daysInEndMonth;

0

পদ্ধতিটি এমন একটি তালিকা প্রত্যাখ্যান করে যাতে 3 টি উপাদান থাকে প্রথম বছর হ'ল দ্বিতীয়, মাসে হয় এবং শেষের দিনটি:

public static List<int> GetDurationInEnglish(DateTime from, DateTime to)
    {
        try
        {
            if (from > to)
                return null;

            var fY = from.Year;
            var fM = from.Month;
            var fD = DateTime.DaysInMonth(fY, fM);

            var tY = to.Year;
            var tM = to.Month;
            var tD = DateTime.DaysInMonth(tY, tM);

            int dY = 0;
            int dM = 0;
            int dD = 0;

            if (fD > tD)
            {
                tM--;

                if (tM <= 0)
                {
                    tY--;
                    tM = 12;
                    tD += DateTime.DaysInMonth(tY, tM);
                }
                else
                {
                    tD += DateTime.DaysInMonth(tY, tM);
                }
            }
            dD = tD - fD;

            if (fM > tM)
            {
                tY--;

                tM += 12;
            }
            dM = tM - fM;

            dY = tY - fY;

            return new List<int>() { dY, dM, dD };
        }
        catch (Exception exception)
        {
            //todo: log exception with parameters in db

            return null;
        }
    }

0

আমি যে মাসিকগুলি সঠিক বলে খুঁজে পেয়েছি তার মধ্যে পার্থক্য পেতে এখানে আমার অবদান রয়েছে:

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

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


0

গেমটি দেরিতে হলেও আমি ধারণা করি এটি কারও পক্ষে সহায়ক হতে পারে। বেশিরভাগ লোকেরা মাস থেকে মাসের বিভিন্ন পরিবর্তনে আসে তা বাদ দিয়ে তারিখের সাথে মাসের পর মাস পরিমাপ করে থাকে। চিন্তার এই ফ্রেমটি ব্যবহার করে আমি একটি লাইন তৈরি করেছি যা আমাদের জন্য তারিখগুলির তুলনা করে। নিম্নলিখিত প্রক্রিয়া ব্যবহার করে।

  1. বছরের তুলনায় 1 বছরের বেশি যে কোনও # বার 12 দ্বারা গুণিত হবে, এমন কোনও ঘটনা নেই যেখানে এটি পুরো 1 বছরের কমের সমান হতে পারে।
  2. যদি শেষ বছরটি আরও বেশি হয় তবে আমাদের বর্তমান দিনটি আগের দিন 2A এর চেয়ে বেশি বা সমান কিনা তা মূল্যায়ন করতে হবে। যদি শেষের দিনটি বৃহত্তর বা সমান হয় তবে আমরা চলতি মাসটি গ্রহণ করি এবং তারপরে 12 মাস যুক্ত করে শুরু মাস 2 বি বিয়োগ করি। শেষের দিনটি যদি শুরু দিনের চেয়ে কম হয় তবে আমরা বিয়োগের আগে শুরু মাসে 1 যোগ করা বাদ দিয়ে উপরের মত একই কাজ করবো
  3. শেষ বছরটি যদি বড় না হয় তবে আমরা 2A / 2B এর মতোই পারফর্ম করি তবে 12 মাস যুক্ত না করে কারণ আমাদের সারা বছর ধরে মূল্যায়ন করার দরকার নেই।

        DateTime date = new DateTime(2003, 11, 25);
        DateTime today = new DateTime(2004, 12, 26);
        var time = (today.Year - date.Year > 1 ? (today.Year - date.Year - 1) * 12 : 0) +  (today.Year > date.Year ? (today.Day >= date.Day ? today.Month + 12 - date.Month : today.Month + 12 - (date.Month + 1)) : (today.Day >= date.Day ? today.Month - date.Month : today.Month - (date.Month + 1)));

তিন্নি দ্বারা মৃত্যু?
স্পেসবিসন

0

আমার এই উত্তরটি গ্রহণ একটি এক্সটেনশন পদ্ধতিও ব্যবহার করে তবে এটি ইতিবাচক বা নেতিবাচক ফলাফল দিতে পারে।

public static int MonthsBefore(this DateTime dt1, DateTime dt2)
{
    (DateTime early, DateTime late, bool dt2After) = dt2 > dt1 ? (dt1,dt2,true) : (dt2,dt1,false);
    DateTime tmp; // Save the result so we don't repeat work
    int months = 1;
    while ((tmp = early.AddMonths(1)) <= late)
    {
        early = tmp;
        months++;
    }
    return (months-1)*(dt2After ? 1 : -1);
}

একটি দম্পতি পরীক্ষা:

// Just under 1 month's diff
Assert.AreEqual(0, new DateTime(2014, 1, 1).MonthsBefore(new DateTime(2014, 1, 31)));
// Just over 1 month's diff
Assert.AreEqual(1, new DateTime(2014, 1, 1).MonthsBefore(new DateTime(2014, 2, 2)));    
// Past date returns NEGATIVE
Assert.AreEqual(-6, new DateTime(2012, 1, 1).MonthsBefore(new DateTime(2011, 6, 10)));

0

উপরের দুটি উত্তর মিলিয়ে অন্য এক্সটেনশন পদ্ধতিটি হ'ল:

public static int ElapsedMonths(this DateTime date1, DateTime date2)
{
    DateTime earlierDate = (date1 > date2) ? date2 : date1;
    DateTime laterDate = (date1 > date2) ? date1 : date2;
    var eMonths = (laterDate.Month - earlierDate.Month) + 12 * (laterDate.Year - earlierDate.Year) - 
                                            ((earlierDate.Day > laterDate.Day) ? 1 : 0);
    return eMonths;
}

@ অ্যাডামরবিনসন এবং @ মার্কউইটকারকে ধন্যবাদ


-1

2 তারিখের মধ্যে মাসের মধ্যে গণনা করুন:

$date1 = '2017-01-20';
$date2 = '2019-01-20';

$ts1 = strtotime($date1);
$ts2 = strtotime($date2);

$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);

$month1 = date('m', $ts1);
$month2 = date('m', $ts2);

echo $joining_months = (($year2 - $year1) * 12) + ($month2 - $month1);

1
এটি পিএইচপি, সি # নয়।
এফ্র্যাক্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.