İki tarih arasındaki farkı hesapla (gün sayısı)?


1092

Bu sorunun Java , JavaScript ve PHP için yanıtlandığını görüyorum , ancak C # değil. Peki, nasıl C # iki tarih arasındaki gün sayısını hesaplamak olabilir?


7
Bu gerçekten yararlı buldum .. başlangıç ​​tarihi ve bitiş tarihi arasındaki tarihlerin listesini almak umut Bu gelecekte özellikle bu arayan herkes yardımcı olur :)
sys_debug

Toplama ve çıkarma işleçleri, beklediğiniz gibi DateTimeve TimeSpantürleri için aşırı yüklenmiştir . Her şey oldukça basit. - Hangi kesin problemle karşılaştın?
BrainSlugs83

Yanıtlar:


2013

Varsayım StartDateve EndDatetürü DateTime:

(EndDate - StartDate).TotalDays

549
Bu cevap açıkça doğrudur, ancak kısmi gün farkının ondalık bir temsili ile değil (a - b).Days, toplam günlerle ilgileniyorsanız da kullanabilirsiniz . intdouble
PFranchise

25
bu 1 gün daha az, 08/31 / 2013-08 / 01/2013 = 31 değerini döndürür, ancak bu yalnızca 30 değerini döndürür.
JRB

60
@JasRajBishnoi - matematiğinizi kontrol etmek isteyebilirsiniz. 31-1 nedir?
Greg Beech

33
JasRaj da her iki tarihi de kapsayıcı olarak farkının bir gün daha az geri döndüğü anlamında haklıydı. Her şey perspektife bağlı.
Fahad Abid Janjua

28
@FahadAbidJanjua Bu bir mesele veya perspektif değil, zaman meselesi, yani tarihin zaman kısmı. 08/31/2013 - 08/01/2013 gerçekten 08/31/2013 00:00:00 - 08/01/2013 00:00:00 anlamına geliyor, bu da neden 30 gün olduğunu açıklıyor çünkü 31/08/2013 günü yeni başlıyor. Bu aynı zamanda, bir DateTime özelliği / alanında sorgulama yaparken, bir aralık elde etmek için uygun koşulun "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)" olduğunu açıklar
Miguel Veloso

160

Üst yanıt doğrudur, ancak int olarak yalnızca BÜTÜN günleri istiyorsanız ve tarihin zaman bileşeninden vazgeçmekten memnuniyet duyarsanız, şunları düşünün:

(EndDate.Date - StartDate.Date).Days

Yine varsayım StartDateve EndDatetiptedir DateTime.


7
En iyi cevap "gün sayısı" normalde tam gün anlamına gelir. It değerinde belirterek Days365 durmaz (gibi diğer özellikleri olarak Hours, Minutes, Secondbir sonraki daha yüksek özellik başladığı Nax hangi değer). Onun aynı TotalDaysama bir gün kesirler olmadan ve intyerine dönen double.
Tim Schmelter

Bu her zaman beklendiği gibi olacak mı? Örneğin, karşılaştırılan günlerden biri "önde gelen" Yaz Saati Uygulaması günüyse, çıkarma 23 saatlik bir TimeSpan üretebilir ve eğer öyleyse, bu 23 saatlik zaman aralığındaki .günlerin değeri 0 olur ? (Bunu kendim denemeye çalıştım, ancak sonuçlarım şu ana kadar sonuçsuz - stackoverflow.com/questions/43644252/… )
Jon Schneider

Evet, ihtiyacım olan şey bu - en değerli cevap cmon şimdi kimse günleri hesaplarken dakika ve saniye hakkında düşünmek istemiyor
solujic

sadece 1,5 gün geçtiyse .Gün fonksiyonu sadece 1 Gün gösterecek mi? 2 gün göstermek için nasıl değiştirebilirim? her zaman + 1 gün eklemek zorunda mıyım?
CDrosos

2
Bunu düzeltmek, çünkü çoğu zaman sadece "24 saatlik aralıkların sayısı" değil, "iki tarih arasındaki TAKVİM günlerine" ihtiyacınız olacaktır. Örneğin, bir zaman çizelgesinde "X gün önce" etiketi görüntülemeniz gerekir. Bu durumda, "Pazartesi 23:59" ile "Salı 07:00" arasındaki fark "1 gün (önce)" olmalıdır ... Yani .Datebölüm gerçekten yararlıdır. Umarım kendimi açıklığa kavuşturuyorum
Alex

138

Tarih çıkarma işleminin sonucu olan TimeSpan nesnesini kullanın:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;

2
(D1 - d2) öğesinin bir TimeSpan nesnesini döndüreceğini açıkça belirtmesi nedeniyle yükseltildi.
Morvael

47

Bence bu istediğini yapacak:

DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now.AddDays(-1);

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;

34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;

1
Neyse DateTime biçiminde gün arasında almak için? Çünkü tablolarda belirli bir alanı değiştirmek için her tarihe ihtiyacım var :) Düzenleme: Anladım ve aşağıdaki cevap olarak gönderdi. Teşekkürler
sys_debug

4
DateTime xmas = yeni DateTime (DateTime.Today.Year, 12, 25); sadece 2009 değil, yıl bazında çalışmasını sağlar :)

1
Subtract () DateTimes için OperatorOverload yani aynı "(xmas - DateTime.Today) .TotalDays - sadece daha uzun.
Marc

20

Birinin tüm gün sayısını çift olarak ( a, btür olarak DateTime) istemesi durumunda :

 (a.Date - b.Date).TotalDays

3
Tarih bölümü her zaman gece yarısı olduğu için bu her zaman bir tam sayı olacaktır (yani n.00000).
JoeNCA

20
// Difference in days, hours, and minutes.

TimeSpan ts = EndDate - StartDate;

// Difference in days.

int differenceInDays = ts.Days; // This is in int
double differenceInDays= ts.TotalDays; // This is in double

// Difference in Hours.
int differenceInHours = ts.Hours; // This is in int
double differenceInHours= ts.TotalHours; // This is in double

// Difference in Minutes.
int differenceInMinutes = ts.Minutes; // This is in int
double differenceInMinutes= ts.TotalMinutes; // This is in double

Farkı saniye, milisaniye ve keneler olarak da alabilirsiniz.


10

Bunu deneyebilirsin

EndDate.Date.Subtract(DateTime.Now.Date).Days

2
Tarih farkım yarım gün olduğu için bu aslında bana en iyi şekilde yardımcı oldu, ancak Amerika Avustralya'nın 1 gün gerisinde kaldığında aslında bir günlük fark olduğunu görmem gerekiyor. Bu iş parçacığında bahsedilen diğer cevaplar ya sıfır ya da ihtiyacım olmayan 1'in altında bazı çift sayı gösteriyor oldu.
Barry Güvenkaya

Bu, zaman açısından tam bir 24 saat olmasa da, tarihin bir sonraki güne geçip geçmediğini kontrol etmek olduğunda en iyi cevaptır.
oneberenjena

4

Benim gibi yeni başlayanlar için bu küçük problemin üzerinde, basit bir çizgide, int'e örnek dönüşümü ile karşılaşacaklar :

int totalDays = Convert.ToInt32((DateTime.UtcNow.Date - myDateTime.Date).TotalDays);

Bu, bugünden (DateTime.UtcNow.Date) ile istediğiniz tarihe (myDateTime.Date) kadar toplam günü hesaplar.

MyDateTime dündeyse veya bugünden daha eski bir tarihse, bu pozitif (+) bir tamsayı sonucu verecektir.

Diğer tarafta, myDateTime yarın veya gelecekteki bir tarihte ise, ekleme kuralları nedeniyle negatif (-) bir tamsayı sonucu verir.

Mutlu kodlama! ^ _ ^


4

Bir zaman aralığı kullanmak, birçok özelliğe sahip olduğu için sorunları çözecektir:

DateTime strt_date = DateTime.Now;
DateTime end_date = Convert.ToDateTime("10/1/2017 23:59:59");
//DateTime add_days = end_date.AddDays(1);
TimeSpan nod = (end_date - strt_date);
Console.WriteLine(strt_date + "" + end_date + "" + "" + nod.TotalHours + "");
Console.ReadKey();

3

İçin ave biki olarak DateTimetipleri:

DateTime d = DateTime.Now;
DateTime c = DateTime.Now;
c = d.AddDays(145);
string cc;
Console.WriteLine(d);
Console.WriteLine(c);
var t = (c - d).Days;
Console.WriteLine(t);
cc = Console.ReadLine();

0

Önce daha sonra geri dönecek bir sınıf ilan edin:

public void date()
{
    Datetime startdate;
    Datetime enddate;
    Timespan remaindate;

    startdate = DateTime.Parse(txtstartdate.Text).Date;
    enddate = DateTime.Parse(txtenddate.Text).Date;

    remaindate = enddate - startdate;

    if (remaindate != null)
    {
        lblmsg.Text = "you have left with " + remaindate.TotalDays + "days.";
    }
    else
    {
        lblmsg.Text = "correct your code again.";
    }
}

protected void btncal_Click(object sender, EventArgs e)
{
    date();
}

Yukarıdaki sınıfı çağırmak için bir düğme kontrolü kullanın. İşte bir örnek:


0

Aşağıdaki kodu kullanabilirsiniz:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

0

İki tarih arasındaki farkı alın ve günleri şu adresten alın:

int total_days = (EndDate - StartDate).TotalDays

1
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın. Lütfen hem kodun hem de açıklamaların okunabilirliğini azalttığı için kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın!
Hoşçakal StackExchange,

2
TotalDays bir çift döndürür: msdn.microsoft.com/en-us/library/… Bu yüzden 22 :
58'de

-21
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
    DateTime d = Calendar1.SelectedDate;
    // int a;
    TextBox2.Text = d.ToShortDateString();
    string s = Convert.ToDateTime(TextBox2.Text).ToShortDateString();
    string s1 =  Convert.ToDateTime(Label7.Text).ToShortDateString();
    DateTime dt = Convert.ToDateTime(s).Date;
    DateTime dt1 = Convert.ToDateTime(s1).Date;
    if (dt <= dt1)
    {
        Response.Write("<script>alert(' Not a valid Date to extend warranty')</script>");
    }
    else
    {
        string diff = dt.Subtract(dt1).ToString();
        Response.Write(diff);
        Label18.Text = diff;
        Session["diff"] = Label18.Text;
    }
}   

21
Bu kod pek çok açıdan yanlış! 1) Soruyla ilgili olmayan birçok Winform kodu. 2) (Ben bir WebBrowser denetimi sanırım) kullanarak mesaj kutuları göstermek için kablolu yolu. 3) zaten etikette gösterilen bir metni göstermek için bir WebBrowser denetimi kullanma. 4) "MyDateA - MyDateB" yaparsanız zaten kullanılan OperatorOverload Subtract () yöntemini ("-" işlemler için varsayılan) kullanma. 5) Bu kod yığını hakkında açıklama yok.
Marc
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.