İki tarih arasındaki ay farkı


334

C # iki tarih arasındaki ay farkı fark nasıl hesaplanır?

DateDiff()C # ' de VB yöntemi eşdeğer var mı . Yıllar arasındaki iki tarih arasındaki aylarda fark bulmam gerekiyor. Belgeler şöyle kullanabileceğimi TimeSpansöylüyor:

TimeSpan ts = date1 - date2;

ama bu bana Gün olarak veri veriyor. Bu sayıyı 30'a bölmek istemiyorum çünkü her ay 30 gün değil ve iki işlenen değeri birbirinden oldukça ayrı olduğundan, 30'a bölmek bana yanlış bir değer verebilir.

Herhangi bir öneri?


27
"Aylardaki fark" ı tanımlayın, "Mayıs 1,2010" ile "16 Haziran 2010" arasındaki aylardaki fark nedir? 1.5, 1 ya da başka bir şey?
Cheng Chen

7
Ya da, bu noktayı daha da vurgulamak için, 31 Aralık 2010 ile 1 Ocak 2011 arasındaki aylar arasındaki fark nedir? Gündüz saatine bağlı olarak bu sadece 1 saniyelik bir fark olabilir; bunu bir aylık fark olarak sayabilir misiniz?
stakx - artık

İşte durumunda basit ve kısa kod, hala, cevap almak bu göremiyordu olan POST stackoverflow.com/questions/8820603/...
wirol

11
Danny: 1 ay 15 gün. stakx: 0 ay ve 1 gün. Mesele ay bileşenini almak . Bu benim için oldukça açık görünüyor ve iyi bir soru.
Kirk Woll

Yanıtlar:


462

Ayın gününün alakasız olduğu varsayılırsa (yani 2011.1.1 ve 2010.12.31 arasındaki fark 1'dir), tarih1> tarih2 pozitif bir değer ve tarih2> tarih1 negatif bir değer verir

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

Veya, iki tarih arasında yaklaşık 'ortalama ay' istediğinizi varsayarsak, aşağıdakiler çok büyük tarih farkları hariç tümü için işe yarayacaktır.

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

İkinci çözümü kullanacaksanız, birim testlerinizde uygulamanızın çalışmak için tasarlandığı en geniş tarih aralığını belirtmesi ve hesaplama sonuçlarını buna göre doğrulaması gerekir.


Güncelleme ( Gary sayesinde )

'Ortalama aylar' yöntemi kullanılıyorsa, 'yıllık ortalama gün sayısı' için kullanılacak biraz daha doğru bir rakam 365.2425'tir .


3
@Kurru - 365/12 gün cinsinden bir ayın ortalama uzunluğunun sadece yaklaşık bir ölçüsüdür. Yanlış bir önlemdir. Küçük tarih aralıkları için bu yanlışlık tolere edilebilir, ancak çok büyük tarih aralıkları için bu yanlışlık önemli olabilir.
Adam Ralph

21
Bence Day bileşenini düşünmek gerekiyor. Böyle bir şey (date1.Year - date2.Year) * 12 + date1.Month - date2.Month + (date1.Day >= date2.Day ? 0 : -1)
DrunkCoder

2
@ DrunkCoder verilen bir sistemin gereksinimlerine bağlıdır. Bazı durumlarda çözümünüz gerçekten de en iyi seçim olabilir. Örneğin, iki tarih 31 günlük bir ay, 30 günlük bir ay, 28 günlük bir Şubat veya 29 günlük bir Şubat'ı kapsadığında ne olacağını düşünmek önemlidir. Formülünüzün sonuçları sistemin gerektirdiğini sağlıyorsa, bu doğru seçimdir. Değilse, başka bir şey gereklidir.
Adam Ralph

6
Adamdem'in ikincisine göre, Aktüerler için kod yazarak yıllar geçirdim. Bazı hesaplamalar gün sayısına bölünür, aylık rakam elde etmek için 30'a yuvarlanır . Bazen her tarih ayın ilkinde başlar ve ayları buna göre hesaplar . Tarihlerin hesaplanması söz konusu olduğunda en iyi yöntem yoktur . Sürece sen müşteri sen yazma kodu muhtemelen müşterilerin muhasebeci tarafından, zincirin yukarı bu geri itin ve açıklık olsun, içindir.
İkili Worrier

1
365.2425, bir Gregoryen Takvimi'nde biraz daha doğru gün sayısıdır, eğer bunu kullanıyorsanız. Ancak, DateTime.MaxValue (1 Ocak 10000) ile bu yaklaşık 59 gün fark. Ayrıca, bir yılın tanımı en.wikipedia.org/wiki/Year bakış açınıza bağlı olarak çok farklı olabilir .
Gary

207

Burada, a'ya DateTimeSpanbenzer TimeSpanşekilde, zaman bileşenlerine ek olarak tüm tarih bileşenlerini içermesi dışında kapsamlı bir çözüm bulunmaktadır .

Kullanımı:

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

Çıktılar:

Yıl: 1
Ay: 5
Gün: 27
Saat: 1
Dakika: 36
Saniye: 50
Milisaniye: 0

Kolaylık sağlamak için, mantığı yapıya DateTimeSpangötürdüm, ancak yöntemi CompareDatesuygun gördüğünüz yere taşıyabilirsiniz . Ayrıca, hangi tarihin diğerinden önce geldiği önemli değildir.

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 teşekkürler. Ama neden DateTimeSpan 34bu tarih zaman farkı için gün döndürür aslında 35 timeanddate.com/date/…
Deeptechtons

@Deptechtons, güzel yakalama. Dikkatimi çektiğiniz bir kaç sorun vardı, her ikisi de başlangıç ​​tarihi ile ilgili 31ve tarihin daha az günle "geçtiği". Mantığı tersine çevirdim (böylece tam tersi durumdan daha erken geçiyor) ve şimdi ayları geçerli tarihi değiştirmeden biriktiriyor (ve böylece aylar arasında daha az gün geçirerek) Hala ideal sonucun ne olduğundan emin değilim ile karşılaştırıldığında 10/31/2012olmalıdır 11/30/2012. Şu anda sonuç 1ay.
Kirk Woll

@KirkWoll güncelleme için teşekkürler, belki birkaç testten sonra onaylamama izin verdim birkaç iş daha iyi iş :)
Deeptechtons

1
Önerilen cevapları test eden benzer bir soruya stackoverflow.com/a/17537472/1737957 bir cevap yazdım (ve çoğunun çalışmadığını gördüm ). Bu cevap (test paketimize göre) işe yarayan birkaç kişiden biridir. Cevabımda github bağlantısı.
jwg

@KirkWoll - Bu yanıt, başlangıç ​​tarihinden bugüne kadar olan bir gün değerinin yüksek olduğu veya kaynak tarihinin artık bir gün olduğu uç durumlarda işe yaramıyor gibi görünüyor. Deneyin 2020-02-29için 2021-06-29doğru, "1y 4m 0d" o "1y 4m 1d" döndürür, ancak değeri olmalıdır? -
Enigmativite

37

Yapabilirsin

if ( date1.AddMonths(x) > date2 )

Bu çok basit ve benim için mükemmel çalışıyor. 1 ayın sonundan bir sonraki ayın sonunda daha az gün içeren bir tarihe kadar hesaplanırken amaçlandığını görmek hoş bir sürpriz oldu. Örneğin .. 1-31-2018 + 1 ay = 28 Şubat 218
lucky.expert

Bu daha iyi çözümlerden biridir.
barnacle.m

Gerçekten basit ve verimli bir çözüm! En iyi cevap önerildi.
Cedric Arnould

2
Tarih1 = 2018-10-28 ve tarih2 = 2018-12-21 ise ne olur? Cevap 2, doğru cevap 3 olmalıdır. Tarih aralığı 3 aydır. günleri görmezden gelerek sadece ayları sayarsak. Yani bu cevap doğru değil.
Tommix

Daha mantıklı olurdu: if ( date1.AddMonths(x).Month == date2.Month )o zaman ay sayısı olarak sadece x + 1 kullanırsınız
Tommix

34

Tam ay sayısını istiyorsanız, her zaman pozitif (2000-01-15, 2000-02-14 0 döndürür), tam bir ay göz önüne alındığında, bir sonraki ayın aynı gününe ulaştığınız zamandır (yaş hesaplaması gibi bir şey)

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

Nedeni düzenle: eski kod aşağıdaki gibi bazı durumlarda doğru değildi:

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

Diğer insanlar için karışıklıktan kaçınmak için, bu çözümün doğru olmadığını düşünüyorum. Test senaryosunu kullanma: new { From = new DateTime(2015, 12, 31), To = new DateTime(2015, 6, 30), Result = 6 } sonuç 5 olduğu için test başarısız olacaktır.
Cristian Badila


Anladığımdan emin değilim, işlevim
Guillaume86

Test davasını buraya elle kopyaladım ve bir hata var. Başarısız Spec olmalıdır: new { From = new DateTime(2015, 12, 31), To = new DateTime(2016, 06, 30), Result = 6 }. "Hata" to.Day < from.Day, ayların farklı bir "ayın günü" ile bitebileceğini dikkate almayan kodda yatar . Bu durumda 31 Aralık 2015'ten 30 Haziran 2016'ya kadar 6 tam ay geçmiş (Haziran 30 gününden beri), ancak kodunuz 5 döndürür.
Cristian Badila

3
Bence beklenen davranış, ya da en azından beklediğim davranış. Tam bir ayın, aynı güne (veya bu durumda olduğu gibi bir sonraki aya) ulaştığınız zamandır.
Guillaume86

22

Bu yöntemin kullanımını MSDN üzerinden VB.NET'te kontrol ettim ve çok fazla kullanımı var gibi görünüyor. C # 'da böyle bir yerleşik yöntem yoktur. (Bu iyi bir fikir olmasa bile) VB'leri C # ile arayabilirsiniz.

  1. Microsoft.VisualBasic.dllProjenize referans olarak ekleyin
  2. kullanmak Microsoft.VisualBasic.DateAndTime.DateDiff Kodunuzdaki

7
Sizce bu neden iyi bir fikir değil? Sezgisel olarak, kütüphane çalışma zamanı için 'sadece başka bir .NET kütüphanesi' olduğunu tahmin ediyorum. Not, burada şeytanın avukatı oynuyorum, bunu da yapmaktan çekiniyorum çünkü sadece 'yanlış geliyor' (bir tür hile) ama bunu yapmamak için ikna edici bir teknik neden olup olmadığını merak ediyorum.
Adam Ralph

3
@AdamRalph: Bunu yapmamak için hiçbir sebep yok. Bu kütüphaneler% 100 yönetilen kodda uygulanır, bu yüzden her şey aynıdır. Akla gelebilecek tek fark, Microsoft.VisualBasic.dllmodülün yüklenmesi gerektiğidir, ancak yapılması gereken zaman ihmal edilebilir düzeydedir. Sadece programınızı C # 'da yazmayı seçtiğiniz için kendinizi tamamen test edilmiş ve kullanışlı özelliklerden aldatmak için hiçbir neden yoktur. (Bu gibi şeyler için My.Application.SplashScreende geçerli.)
Cody Gray

3
C # ile yazılmış olduğunu bilseydiniz fikrinizi değiştirir misiniz? Öyleydi. Aynı mantıkla, System.Data ve PresentationFramework kullanımı da hile yapıyor, önemli bölümleri C ++ / CLI ile yazılmış.
Hans Passant

3
@AdamRalph: Akla ilk gelen "garip bagaj" ın belirli örnekleri var mı? Yoksa bunu sadece varsayımsal olarak mı söylüyorsunuz? Ve evet, doğru usingifadeyle tek bir satırda yapabileceğiniz bir şey yapmak için epik bir kod yazmış olan bazı C # arkadaşlarınızın zihinleriyle uğraşabilir , ancak ciddi bir hasar olacağından şüpheliyim.
Cody Gray

1
@Cody Gray: kabul etti, örnekte gördüğünüz gibi önemsiz. Bu önlemek için istekli olağandışı bir (C # POV) yöntemini çağırarak tanıtılan ekstra kod 'gürültü'. İyi organize olmuş bir takımda böyle şeyler zaten kod incelemesinde alınacak ve kolayca önlenebilir. BTW - VB6 / VB.NET'e saldırmaya çalışmıyorum. Bu tür yöntemleri 'garip' olarak tanımladım çünkü bir .NET POV'dan, bir özelliğe sahip DateAndTime.Year()olduğu için var olmanın bir nedeni yok . Sadece VB.NET'in VB6 gibi görünmesini sağlamak için var. Eski bir VB6 programcısı olarak bunu takdir edebilirim ;-)DateTimeYear
Adam Ralph

10

Tarihlerden bağımsız olarak aylarda (hem başlangıç ​​hem de son dahil) fark elde etmek için:

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
Hayal edin startve endaynılar. Sonra 1 sonucunu alırsınız. Bu nasıl doğru? Sonuca neden 1 ekliyorsunuz? Bu cevabı kimler oyluyor: - /?
paul

Aynı tarihler için çıktı 1 olarak verilir. Temel olarak, başlangıç ​​ve bitiş ayları dahil tüm ayları sayacaktır.
Chirag

3
bana iki madde arasındaki fark gibi gelmiyor. 2 ve 2 arasındaki fark nedir? Gerçekten 1 mi?
paul

8

Noda Zamanını Kullan :

LocalDate start = new LocalDate(2013, 1, 5);
LocalDate end = new LocalDate(2014, 6, 1);
Period period = Period.Between(start, end, PeriodUnits.Months);
Console.WriteLine(period.Months); // 16

(örnek kaynak)


7

Sadece ay / yılın girildiği istihdam tarihleri ​​için yiyecek ve içecek sağlamak için basit bir şeye ihtiyacım vardı, bu yüzden farklı yıllar ve aylar çalışmak istedim.

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 Keman


4

.NET için Time Period Library'nin DateDiff sınıfını kullanabilirsiniz :

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

İşte doğru bulduğum aylarda fark elde etmek için katkım:

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

Kullanımı:

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

DiffYears adında başka bir yöntem oluşturabilir ve while döngüsünde AddMonths yerine yukarıdakiyle ve AddYears ile tam olarak aynı mantığı uygulayabilirsiniz.


2

Bu ihtiyacım olan şey için çalıştı. Ayın günü benim durumumda önemli değildi çünkü her zaman ayın son günü oluyor.

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

En kesin yol, ay cinsinden farkın kesir olarak döndürülmesidir:

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

İşte en azından benim için çalışan basit bir çözüm. Bir döngüde harika DateTime'ın AddMonth özelliğini kullandığı için muhtemelen en hızlı değil:

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

Bu kendi kütüphanemden, iki tarih arasındaki ay farkını döndürecek.

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
Bu çalışıyor mu? Ben kağıt için 11 almaya devam Jan-31-2014veDec-31-2013
Dave Cousineau

1

Bunun gibi bir işleve sahip olabilirsiniz.

Örneğin, 2012/12/27 - 2012/12/29 arası 3 gün olur. Aynı şekilde, 2012/12/15 - 2013/01/15 tarihleri ​​arasında 2 ay olur, çünkü 2013/01/14 tarihine kadar 1 aydır. 15. aydan itibaren 2. ay başladı.

Hesaplamaya her iki günü de dahil etmek istemiyorsanız "=" ifadesini ikinci if durumunda kaldırabilirsiniz. yani, 2012/12/15 ile 2013/01/15 arasında 1 aydır.

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

aşağıdaki uzantıyı kullanabilirsiniz: Kod

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
}

Uygulama!

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

İşte yalnızca Yıl, Ay, Gün için VB.Net DateDiff'i kullanan çok daha özlü bir çözüm. DateDiff kütüphanesini C # 'a da yükleyebilirsiniz.

tarih1, <= tarih2 olmalıdır

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

C #

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

Bu Kirk Woll'un cevabına bir yanıt. Henüz bir yorumu yanıtlamak için yeterli itibar puanım yok ...

Kirk'ün çözümünü beğendim ve utanmadan söküp kodumda kullanacaktım, ama baktığımda çok karmaşık olduğunu fark ettim. Gereksiz anahtarlama ve döngü ve kullanımı anlamsız bir kamu kurucusu.

İşte yeniden yazım:

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

Kullanım1, hemen hemen aynı:

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

Kullanım2, benzer:

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

Benim durumumda, başlangıç ​​ayından sonraki ayın bu gününden önceki gününe veya ayın başlangıcından sonuna kadar tüm ayı hesaplamak gerekir.


Örn: 1/1/2018 - 31/1/2018 arası tam bir aydır
Ex2: 01.05.2018 - 4/2/2018 arası tam bir ay

İşte buna dayalı benim çözüm:

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

Kullanımı:

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

Not: Benim durumumda, tam aylardan sonra kalan günlerin hesaplanması gerekiyordu, bu durumda sizin durumunuz değilse, gün sonucunu yoksayabilir veya hatta yöntem dönüşünü demetten tamsayıya değiştirebilirsiniz.


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

Bu çözüm, farkın çıkarılması anlamına gelmediği Kiralama / abonelik hesaplaması içindir, bu iki tarih içindeki açıklıktır.


1

3 vaka var: aynı yıl, önceki yıl ve diğer yıllar.

Ayın günü önemli değilse ...

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

Bunu başarmak için bir işlev yazdım, çünkü diğer yollar benim için işe yaramıyordu.

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

Lütfen İngilizce olarak cevap verin (icat edilen herhangi bir dile karşı ...)
Kleopatra

Neden startDate.AddMonths (monthCount) .ToShortDateString () yapmıyoruz? Bu zaten sorulan orijinal soruya cevap vermiyor!
TabbyCool

oh, üzgünüm @TabbyCool, bu kod programımda iyi çalışıyor! programcılar kural diyor: ilk kod çalışır ve sonra optimizasyon! tanx for ur comment :)
reza akhlaghi

1

2 tarih arasındaki toplam ay farkını anladım, ayrılmaz ve kesirli bir bölüm var (tarih önemli).

Ayrılmaz kısım tam ay farkıdır.

Kesirli kısım, benim için, başlangıç ​​ve bitiş ayları arasındaki günün yüzdesinin (ayın tam günlerine) farkıdır.

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

Bu uzantıyla, sonuçlar şunlardır:

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

Bu konuda çok net bir cevap yok çünkü her zaman bir şeyler varsayıyorsunuz.

Bu çözüm, karşılaştırma için ayın gününü kaydetmek istediğinizi varsayarak aylar arasındaki iki tarih arasında hesaplar (yani ayın gününün hesaplamada dikkate alındığı anlamına gelir).

Örneğin, 30 Ocak 2012 tarihli bir tarihiniz varsa, 29 Şubat 2012 bir ay değil, 01 Mart 2013 olacaktır.

Oldukça iyice test edildi, muhtemelen daha sonra kullandığımızda temizleyecek, ama burada:

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

Yukarıda yapılan mükemmel DateTimeSpan çalışmalarına dayanarak, kodu biraz normalleştirdim; bu oldukça iyi çalışıyor gibi görünüyor:

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)Nerede x={01/02/2019 00:00:00}ve y={01/05/2020 00:00:00}sonra Monthsbana verirken karşılaştırıldığında2
Bassie

1

Bu basit statik işlev, iki tarih arasındaki ayın bölümünü hesaplar, ör.

  • 1.1. 31.1. = 1.0
  • 1.4. 15.4'e kadar. = 0,5
  • 16.4. 30.4'e kadar. = 0,5
  • 1.3. 1.4'e kadar. = 1 + 1/30

İşlev, ilk tarihin ikinci tarihten daha küçük olduğunu varsayar. Negatif zaman aralıklarıyla başa çıkmak için başlangıçta bir işaret ve değişken takas girerek işlev kolayca değiştirilebilir.

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

Aylardaki 2 tarih arasındaki farkı hesaplayabilmek mükemmel bir mantıklı şeydir ve birçok iş uygulamasında gereklidir. Burada, "Mayıs 1,2010" ile "16 Haziran 2010 arasındaki aylar arasındaki fark nedir, 31 Aralık 2010 ile 1 Ocak 2011 arasındaki aylar arasındaki fark nedir? - iş uygulamalarının temelleri.

Yukarıdaki 2 yorumun cevabı - 1-Mayıs-2010 ve 16-Haziran-2010 arasındaki ay sayısı 1 ay, 31-Aralık-2010 ve 1-Ocak-2011 arasındaki ay sayısı 0'dır. yukarıdaki kodlayıcıların önerdiği gibi 1.5 ay ve 1 saniye olarak hesaplamak çok aptalca olur.

Kredi kartı, ipotek işlemleri, vergi işlemleri, kira işlemleri, aylık faiz hesaplamaları ve çok çeşitli diğer iş çözümleri üzerinde çalışan kişiler aynı fikirde olacaktır.

Sorun, böyle bir işlevin C # veya VB.NET'te bu konuda bulunmamasıdır. Datediff sadece yıl veya ay bileşenini dikkate alır, bu yüzden aslında işe yaramaz.

Ayları nerede hesaplamanız gerektiği ve doğru bir şekilde hesaplayabileceğiniz bazı gerçek hayat örnekleri:

18-feb'den 23-aug'a kadar kısa süreli bir kiralamada yaşadınız. Orada kaç ay kaldın? Cevap basit - 6 ay

Her ayın sonunda faizin hesaplandığı ve ödendiği bir banka hesabınız var. 10 haziran'a para yatırıyorsunuz ve 29-okt (aynı yıl) çıkarıyorsunuz. Kaç ay ilgi görüyorsunuz? Çok basit cevap - 4 ay (yine ekstra günler önemli değil)

İş uygulamalarında, çoğu zaman, ayları hesaplamanız gerektiğinde, bunun nedeni insanların zamanı nasıl hesapladığına bağlı olarak 'tam' ayları bilmeniz gerektiğidir; bazı soyut / alakasız düşüncelere dayanmaz.


5
Muhasebenin matematik olmamasının nedenlerinden biri de budur. Muhasebede sonuç, hesaplama şeklinize bağlıdır .. Puanlarınızı biliyorum ve bu konuda "ortak iş görüşünü" biliyorum, ama bu açıklama açıkça yanlış. 2012.11.30 ve 2012.12.01 arasında , ne istediğinize bağlı olarak 0 veya 1/30 veya 1/31 veya 1 veya 2 ay vardır . Tarihler kapsayıcı veya kapsayıcı mıydı? Kaç ay geçtiniz, dokundunuz veya geçtiniz mi? Yuvarlama, yuvarlama veya kesin mi istediniz?
quetzalcoatl

3
Şimdi bunu bir iş adamına veya muhasebeciye açıklayın, size şaşkın bir görünüm kazandıracaklar. Her zaman "onlar için elbette X ve Y ve Z demek istedikleri çok açık, nasıl farklı düşünebilirdiniz?" Şimdi birkaç iş adamı edinin ve konuyu kabul etmelerini sağlamaya çalışın. Muhasebecilerin aynı fikirde olma olasılığı daha yüksektir, çünkü bir noktada matematiği aynı dönemi iki kez kazara özetleyebilecekleri seçenekleri kontrol etmek için kullanacaklardır. ekstra günleri yok saymak gibi ekstra iş kuralları.
quetzalcoatl

2
-1 Tüm yazılımların bir "iş uygulaması" olduğunu varsayıyorsunuz. Söz konusu kodun amacı belirtilmemiştir. Ayrıca, tüm "iş uygulamalarının" aynı kurallara sahip olduğunu varsayarsınız ki bu kesinlikle doğru değildir.
Jesse Webb

0

ToString (biçim) ve Süre (uzun ms) ile genişletilmiş Kirks yapısı

 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));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.