Hitung perbedaan antara dua tanggal (jumlah hari)?

1093

Saya melihat bahwa pertanyaan ini telah dijawab untuk Java , JavaScript , dan PHP , tetapi tidak untuk C #. Jadi, bagaimana seseorang menghitung jumlah hari antara dua tanggal dalam C #?

leora
sumber
7
Saya menemukan ini sangat berguna benar-benar .. mendapatkan daftar tanggal antara tanggal mulai dan tanggal akhir Semoga ini bisa membantu siapa saja yang mencari ini khususnya di masa depan :)
sys_debug
Operator penambahan dan pengurangan kelebihan beban untuk DateTimedan TimeSpanjenis seperti yang Anda harapkan. Itu semua sangat mudah. - Masalah persis apa yang Anda temui?
BrainSlugs83

Jawaban:

2013

Dengan asumsi StartDatedan EndDatetipe DateTime:

(EndDate - StartDate).TotalDays
Greg Beech
sumber
549
Jawaban ini jelas benar, tetapi Anda juga dapat menggunakan (a - b).Daysjika Anda tertarik pada total hari sebagai intbukan doubledengan representasi desimal dari perbedaan sebagian hari.
PFranchise
25
ini akan mengembalikan 1 hari lebih sedikit, 08/31 / 2013-08 / 01/2013 = 31 tetapi ini hanya mengembalikan 30.
JRB
60
@JasRajBishnoi - Anda mungkin ingin memeriksa matematika Anda. Apa itu 31 - 1?
Greg Beech
33
JasRaj juga benar dalam arti bahwa termasuk kedua tanggal itu mengembalikan satu hari lebih sedikit perbedaan. Itu semua tergantung perspektif.
Fahad Abid Janjua
28
@FahadAbidJanjua Ini bukan masalah atau perspektif tetapi masalah waktu, maksud saya, bagian waktu dari tanggal. 08/31/2013 - 08/01/2013 sangat berarti 08/31/2013 00:00:00 - 08/01/2013 00:00:00 yang menjelaskan mengapa 30 hari, karena hari 08/31/2013 adalah baru mulai. Itu juga menjelaskan mengapa, saat melakukan pencarian pada properti / bidang DateTime, kondisi yang tepat untuk mendapatkan rentang adalah "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)"
Miguel Veloso
161

Jawaban teratas sudah benar, namun jika Anda hanya ingin SELURUH hari sebagai int dan dengan senang hati melupakan komponen waktu pada tanggal tersebut maka pertimbangkan:

(EndDate.Date - StartDate.Date).Days

Sekali lagi dengan asumsi StartDatedan EndDatetipe DateTime.

Darren
sumber
7
Jawaban terbaik karena "jumlah hari" biasanya berarti sepanjang hari. Itu perlu dicatat bahwa Daystidak berhenti di 365 (sebagai properti lain seperti Hours, Minutes, Secondyang nilai nax adalah di mana properti yang lebih tinggi berikutnya dimulai). Itu sama TotalDaystetapi tanpa pecahan sehari dan kembali intbukannya double.
Tim Schmelter
Apakah ini akan selalu berfungsi seperti yang diharapkan? Misalnya, jika salah satu hari yang dibandingkan adalah hari musim semi "maju", dapatkah pengurangan menghasilkan TimeSpan 23 jam, dan jika demikian, apakah nilai .Days pada rentang waktu 23 jam menjadi 0 ? (Saya mencoba bereksperimen dengan ini sendiri, tetapi hasil saya sejauh ini tidak meyakinkan - stackoverflow.com/questions/43644252/... )
Jon Schneider
Yup, ini yang saya butuhkan - jawaban paling berharga cmon sekarang tidak ada yang mau memikirkan Menit dan Detik dalam hitungan hari
solujic
jika hanya 1,5 hari telah berlalu, fungsi Days ini akan menunjukkan hanya 1 Hari? bagaimana saya bisa mengubahnya untuk ditampilkan 2 hari? saya hanya harus selalu menambahkan +1 hari?
CDrosos
2
Upvoting ini, karena sangat sering Anda akan memerlukan "KALENDER hari antara dua tanggal", bukan hanya "jumlah interval 24 jam". Misalnya, Anda perlu menampilkan label "X hari yang lalu" dalam timeline. Dalam hal ini perbedaan antara "Senin 11:59 malam" dan "Selasa 7:00 pagi" harus "1 hari (lalu)" ... Jadi .Datebagian ini sangat berguna. Saya harap saya menjelaskan
Alex
138

Gunakan objek TimeSpan yang merupakan hasil dari substraksi tanggal:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;
Vitaliy Liptchinsky
sumber
2
Diperbaharui hanya karena memperjelas bahwa (d1 - d2) akan mengembalikan objek TimeSpan.
Morvael
47

Saya pikir ini akan melakukan apa yang Anda inginkan:

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

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;
pirokumulus
sumber
34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;
Philip Wallace
sumber
1
Pokoknya untuk mendapatkan hari-hari di antara dalam format DateTime? Karena saya perlu setiap tanggal untuk memodifikasi bidang tertentu dalam tabel :) Edit: Mendapat dan mempostingnya sebagai jawaban di bawah ini. Terima kasih
sys_debug
4
DateTime xmas = DateTime baru (DateTime.Today.Year, 12, 25); akan membuatnya bekerja setiap tahun, bukan hanya 2009 :)
1
Kurangi () adalah OperatorOverload untuk DateTimes jadi itu sama "(xmas - DateTime.Today) .TotalDays - lebih lama.
Marc
20

Jika seseorang menginginkan angka sepanjang hari sebagai dobel ( a, bbertipe DateTime):

 (a.Date - b.Date).TotalDays
kingPuppy
sumber
3
Ini akan selalu menjadi bilangan bulat (yaitu, n.00000) karena bagian Tanggal selalu tengah malam.
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

Anda juga bisa mendapatkan perbedaan dalam hitungan detik, milidetik, dan kutu.

Vijay Maheriya
sumber
10

Anda bisa mencoba ini

EndDate.Date.Subtract(DateTime.Now.Date).Days
Rohidas Kadam
sumber
2
Ini sebenarnya membantu saya yang terbaik karena perbedaan tanggal saya setengah hari, tetapi masih ketika Amerika 1 hari di belakang Australia saya perlu melihat sebenarnya ada perbedaan satu hari. Jawaban lain yang disebutkan dalam utas ini menunjukkan nol atau angka ganda di bawah 1 yang tidak saya butuhkan.
Barry Guvenkaya
Ini adalah jawaban terbaik ketika tujuannya adalah untuk memeriksa apakah tanggal telah berlalu ke hari berikutnya, tidak masalah jika dari segi waktu bukan 24 jam penuh.
oneberenjena
4

Untuk pemula seperti saya yang akan menemukan masalah kecil ini, dalam garis sederhana, dengan konversi sampel ke int :

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

Ini menghitung total hari dari hari ini (DateTime.UtcNow.Date) ke tanggal yang diinginkan (myDateTime.Date).

Jika myDateTime adalah kemarin, atau lebih tua dari hari ini, ini akan memberikan hasil bilangan bulat positif (+).

Di sisi lain, jika myDateTime adalah besok atau di masa mendatang, ini akan memberikan hasil bilangan bulat negatif (-) karena aturan penambahan.

Selamat coding! ^ _ ^

Curbside Coder
sumber
4

Menggunakan rentang waktu akan menyelesaikan masalah karena memiliki banyak atribut:

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();
Vijay Vj
sumber
3

Untuk adan bsebagai dua DateTimejenis:

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();
Pratyush Dhanuka
sumber
0

Pertama mendeklarasikan kelas yang akan kembali nanti:

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

Gunakan tombol kontrol untuk memanggil kelas di atas. Berikut ini sebuah contoh:

Muba
sumber
0

Anda dapat menggunakan kode di bawah ini:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds
Code_Worm
sumber
0

Dapatkan perbedaan antara kedua tanggal dan kemudian dapatkan hari dari:

int total_days = (EndDate - StartDate).TotalDays
Muhamad Eissa
sumber
1
Sementara potongan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda. Tolong juga cobalah untuk tidak membuat kerumunan kode Anda dengan komentar penjelasan, karena ini mengurangi keterbacaan kode dan penjelasan!
Selamat tinggal StackExchange
2
TotalDays mengembalikan dua kali lipat: msdn.microsoft.com/en-us/library/... Jadi, Anda perlu konversi ke int
qnguyen
-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;
    }
}   
sangeetha
sumber
21
Kode ini salah dalam banyak hal! 1) Banyak kode Winforms yang tidak terkait dengan pertanyaan. 2) Cara kabel menampilkan kotak pesan menggunakan (Saya kira kontrol WebBrowser). 3) menggunakan kontrol WebBrowser untuk menampilkan teks yang sudah ditunjukkan pada label. 4) Menggunakan OperatorOverload Kurangi () (default untuk "-" operasi) yang digunakan untuk tetap jika Anda melakukan "MyDateA - MyDateB". 5) Tidak ada penjelasan tentang tumpukan kode ini.
Marc