Tính hiệu số giữa hai ngày (số ngày)?


1093

Tôi thấy rằng câu hỏi này đã được trả lời cho Java , JavaScriptPHP , nhưng không phải là C #. Vậy, làm thế nào người ta có thể tính số ngày giữa hai ngày trong C #?


7
Tôi thấy điều này khá hữu ích thực sự .. nhận danh sách ngày giữa ngày bắt đầu và ngày kết thúc Hy vọng điều này sẽ giúp bất cứ ai tìm kiếm điều này đặc biệt trong tương lai :)
sys_debug

Các toán tử cộng và trừ bị quá tải cho DateTimeTimeSpancác loại như bạn mong đợi. Tất cả đều khá đơn giản. - Vấn đề chính xác nào bạn gặp phải?
BrainSlugs83

Câu trả lời:


2013

Giả sử StartDateEndDatecó loại DateTime:

(EndDate - StartDate).TotalDays

549
Câu trả lời này rõ ràng là chính xác, nhưng bạn cũng có thể sử dụng (a - b).Daysnếu bạn quan tâm đến tổng số ngày intthay vì doubleđại diện thập phân của chênh lệch một phần ngày.
PFranchise

25
cái này sẽ trả lại 1 ngày nữa, 08/31 / 2013-08 / 01/2013 = 31 nhưng cái này chỉ trả về 30 thôi.
JRB

60
@JasRajBishnoi - bạn có thể muốn kiểm tra toán học của mình. 31 - 1 là gì?
Greg Beech

33
JasRaj cũng đúng theo nghĩa bao gồm cả hai ngày nó trả lại một ngày ít khác biệt. Tất cả phụ thuộc vào quan điểm.
Fahad Abid Janjua

28
@FahadAbidJanjua Đó không phải là vấn đề hay quan điểm mà là vấn đề thời gian, ý tôi là, phần thời gian của ngày. 08/08/2013 - 08/01/2013 thực sự có nghĩa là 31/12/2013 00:00:00 - 08/01/2013 00:00:00 giải thích tại sao là 30 ngày, vì ngày 31/08/2013 là chỉ mới bắt đầu. Điều đó cũng giải thích tại sao, khi truy vấn thuộc tính / trường DateTime, điều kiện thích hợp để có phạm vi là "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)"
Miguel Veloso

160

Câu trả lời hàng đầu là chính xác, tuy nhiên nếu bạn chỉ muốn ngày WHOLE là int và vui lòng từ bỏ thành phần thời gian của ngày thì hãy xem xét:

(EndDate.Date - StartDate.Date).Days

Một lần nữa giả định StartDateEndDatelà loại DateTime.


7
Câu trả lời tốt nhất vì "số ngày" thường có nghĩa là cả ngày. Nó đáng chú ý là Dayskhông chỉ dừng lại ở 365 (như các tài sản khác như Hours, Minutes, Secondmà nax giá trị là nơi mà các tài sản cao hơn tiếp theo bắt đầu). Nó giống như TotalDaysnhưng không có phân số của một ngày và trở lại intthay vì double.
Tim Schmelter

Điều này sẽ luôn làm việc như mong đợi? Ví dụ: nếu một trong những ngày được so sánh là ngày Thời gian tiết kiệm ánh sáng ban ngày "mùa xuân tới", phép trừ có thể tạo ra TimeSpan là 23 giờ và nếu vậy, giá trị của .Days trong khoảng thời gian 23 giờ đó là 0 ? (Tôi đã thử tự mình thử nghiệm nhưng kết quả của tôi vẫn chưa có kết quả - stackoverflow.com/questions/43644252/iêu )
Jon Schneider

Vâng, đây là những gì tôi cần - cmon câu trả lời có giá trị nhất bây giờ không ai muốn nghĩ về Phút và Giây trong ngày tính toán
solujic

Nếu chỉ 1,5 ngày trôi qua, chức năng này sẽ chỉ hiển thị 1 Ngày? Làm thế nào tôi có thể thay đổi nó để hiển thị 2 ngày? tôi chỉ phải luôn luôn thêm + 1 ngày?
CDrosos

2
Nâng cao điều này, bởi vì rất thường xuyên bạn sẽ cần "LỊCH NGÀY giữa hai ngày", không chỉ là "số lượng khoảng thời gian 24 giờ". Ví dụ: bạn cần hiển thị nhãn "X ngày trước" trong dòng thời gian. Trong trường hợp này, sự khác biệt giữa "Thứ Hai 11:59 tối" và "Thứ Bảy 7:00 sáng" phải là "1 ngày (trước)" ... Vì vậy, .Datephần này thực sự hữu ích. Hy vọng tôi làm cho mình rõ ràng
Alex

138

Sử dụng đối tượng TimeSpan là kết quả của phép tính ngày:

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

2
Được nâng cấp đơn giản vì nó làm rõ rằng (d1 - d2) sẽ trả về một đối tượng TimeSpan.
Morvael

47

Tôi nghĩ rằng điều này sẽ làm những gì bạn muốn:

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
Dù sao để có được những ngày ở giữa trong định dạng DateTime? Bởi vì tôi cần mỗi ngày để sửa đổi một trường nhất định trong bảng :) Chỉnh sửa: Có nó và đăng nó dưới dạng câu trả lời dưới đây. Cảm ơn
sys_debug

4
DateTime xmas = DateTime mới (DateTime.Today.Year, 12, 25); sẽ làm cho nó hoạt động theo từng năm, không chỉ năm 2009 :)

1
Subtract () là OperatorOverload cho DateTimes để cùng các của nó "(giáng sinh - DateTime.Today) .TotalDays - chỉ cần lâu hơn.
Marc

20

Trong trường hợp ai đó muốn số của cả ngày là gấp đôi ( a, bloại DateTime):

 (a.Date - b.Date).TotalDays

3
Đây sẽ luôn là một số nguyên mặc dù (ví dụ: n.00000) vì phần Ngày luôn là nửa đêm.
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

Bạn cũng có thể nhận được sự khác biệt trong vài giây, mili giây và tích tắc.


10

Bạn có thể thử cái này

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

2
Điều này thực sự giúp tôi tốt nhất vì sự khác biệt ngày của tôi là nửa ngày nhưng khi nước Mỹ chậm hơn Úc 1 ngày tôi cần phải thấy thực sự có một ngày khác biệt. Các câu trả lời khác được đề cập trong chủ đề này là hiển thị số 0 hoặc số kép dưới 1 mà tôi không cần.
Barry Guvenkaya

Đây là câu trả lời tốt nhất khi mục đích là để kiểm tra xem ngày đã trôi qua vào ngày hôm sau chưa, cho dù về mặt thời gian không phải là một ngày đầy đủ trong 24 giờ.
oneberenjena

4

Đối với những người mới bắt đầu như tôi sẽ vấp phải vấn đề nhỏ này, trong một dòng đơn giản, với chuyển đổi mẫu thành int :

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

Điều này sẽ tính tổng số ngày kể từ hôm nay (DateTime.UtcNow.Date) đến một ngày mong muốn (myDateTime.Date).

Nếu myDateTime là ngày hôm qua hoặc ngày cũ hơn ngày hôm nay, điều này sẽ cho kết quả số nguyên dương (+).

Mặt khác, nếu myDateTime là vào ngày mai hoặc vào ngày trong tương lai, điều này sẽ cho kết quả số nguyên âm (-) do quy tắc cộng.

Chúc mừng mã hóa! ^ _ ^


4

Sử dụng một khoảng thời gian sẽ giải quyết các vấn đề vì nó có nhiều thuộc tính:

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

Cho abnhư hai DateTimeloại:

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

Đầu tiên khai báo một lớp sẽ trở lại sau:

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

Sử dụng một nút điều khiển để gọi lớp trên. Đây là một ví dụ:


0

Bạn có thể sử dụng mã dưới đây:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

0

Nhận sự khác biệt giữa hai ngày và sau đó nhận các ngày từ:

int total_days = (EndDate - StartDate).TotalDays

1
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Xin vui lòng cố gắng không làm đông mã của bạn với các bình luận giải thích, vì điều này làm giảm khả năng đọc của cả mã và các giải thích!
Tạm biệt StackExchange

2
TotalDays trả lại gấp đôi: msdn.microsoft.com/en-us/l Library / So Vì vậy, bạn cần chuyển đổi sang int
qnguyen 15/03/18

-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
Mã này sai theo nhiều cách! 1) Rất nhiều mã Winforms không liên quan đến câu hỏi. 2) Cách hiển thị các hộp thông báo có dây bằng cách sử dụng (Tôi đoán điều khiển WebBrowser). 3) sử dụng điều khiển WebBrowser để hiển thị văn bản đã được hiển thị trên nhãn. 4) Sử dụng Toán tử toán tử tải () mặc định cho các thao tác "-") được sử dụng cho mọi cách nếu bạn thực hiện "MyDateA - MyDateB". 5) Không có lời giải thích tho đống mã này.
Marc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.