คำนวณความแตกต่างระหว่างสองวัน (จำนวนวัน) หรือไม่


1092

ฉันเห็นว่าคำถามนี้ได้รับคำตอบสำหรับJava , JavaScriptและPHPแต่ไม่ใช่ C # ดังนั้นวิธีหนึ่งอาจคำนวณจำนวนวันระหว่างสองวันใน C #


7
ผมพบว่ามีประโยชน์นี้สวยจริงๆ .. ได้รับรายการของวันระหว่างวันที่เริ่มต้นและวันสิ้นสุดความหวังนี้จะช่วยให้ทุกคนที่กำลังมองหานี้โดยเฉพาะอย่างยิ่งในอนาคต :)
sys_debug

ตัวดำเนินการการบวกและการลบถูกโอเวอร์โหลดสำหรับDateTimeและTimeSpanประเภทตามที่คุณคาดหวัง มันค่อนข้างตรงไปตรงมา - คุณพบปัญหาอะไรกันแน่?
BrainSlugs83

คำตอบ:


2013

สมมติStartDateและEndDateเป็นประเภทDateTime:

(EndDate - StartDate).TotalDays

549
เห็นได้ชัดว่าคำตอบนี้ถูกต้อง แต่คุณสามารถใช้(a - b).Daysถ้าคุณมีความสนใจในวันรวมเป็นintมากกว่าที่doubleมีการแสดงทศนิยมของความแตกต่างบางส่วนของวัน
PFranchise

25
สิ่งนี้จะส่งคืน 1 วันน้อยกว่า 08/31 / 2013-08 / 01/2013 = 31 แต่จะคืน 30 เท่านั้น
JRB

60
@JasRajBishnoi - คุณอาจต้องการตรวจสอบคณิตศาสตร์ของคุณ 31 - 1 คืออะไร
เกร็กบีช

33
JasRaj ก็ถูกต้องในแง่ที่รวมทั้งสองวันที่จะให้ผลต่างน้อยกว่าหนึ่งวัน ทุกอย่างขึ้นอยู่กับมุมมอง
Fahad Abid Janjua

28
@FahadAbidJanjua ไม่ใช่เรื่องหรือมุมมอง แต่เป็นเรื่องของเวลาฉันหมายถึงส่วนเวลาของวันที่ 08/31/2013 - 08/01/2013 จริงๆแล้วหมายถึง 08/31/2013 00:00:00 - 08/01/2013 00:00:00 ซึ่งอธิบายว่าทำไมมันถึง 30 วันเพราะวันที่ 08/31/2013 เป็น เพิ่งเริ่มต้น นั่นยังอธิบายว่าทำไมเมื่อทำการสอบถามคุณสมบัติ / เขตข้อมูล DateTime เงื่อนไขที่เหมาะสมในการรับช่วงคือ "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)"
Miguel Veloso

160

คำตอบยอดนิยมนั้นถูกต้องอย่างไรก็ตามหากคุณต้องการเพียงแค่วันเดียวในฐานะ int และยินดีที่จะละทิ้งองค์ประกอบเวลาของวันที่ให้พิจารณา:

(EndDate.Date - StartDate.Date).Days

อีกครั้งสมมติStartDateและเป็นประเภทEndDateDateTime


7
คำตอบที่ดีที่สุดเพราะปกติ"จำนวนวัน"หมายถึงทั้งวัน มันน่าสังเกตว่าDaysไม่หยุดอยู่ที่ 365 (ในขณะที่คุณสมบัติอื่น ๆ เช่นHours, Minutes, Secondซึ่งค่า Nax คือที่ที่อยู่ถัดจากสถานที่ให้บริการที่สูงขึ้นเริ่มต้น) มันเป็นเช่นเดียวกับTotalDaysแต่ไม่มีเศษของวันและกลับมาแทนint double
Tim Schmelter

สิ่งนี้จะทำงานได้ตามปกติหรือไม่ ตัวอย่างเช่นหากวันใดวันหนึ่งที่เปรียบเทียบเป็นวันที่ "เลื่อนไปข้างหน้า" การเลื่อนเวลาตามฤดูกาลการลบสามารถสร้าง TimeSpan ได้ 23 ชั่วโมงและถ้าเป็นเช่นนั้นค่าของวันในช่วงเวลา 23 ชั่วโมงนั้นจะเป็น 0 ? (ฉันพยายามทดลองด้วยตัวเอง แต่ผลลัพธ์ของฉันยังสรุปไม่ได้ - stackoverflow.com/questions/43644252/ … )
Jon Schneider

ใช่นี่คือสิ่งที่ฉันต้องการ - คำตอบที่มีค่าที่สุดตอนนี้ไม่มีใครอยากคิดเกี่ยวกับนาทีและวินาทีในการคำนวณวัน
solujic

ถ้าเพียง 1,5 วันผ่านไปฟังก์ชันวันจะแสดงเพียง 1 วัน ฉันจะเปลี่ยนมันเพื่อแสดง 2 วันได้อย่างไร ฉันต้องเพิ่ม +1 ตลอดเวลาหรือไม่
CDrosos

2
การลงทะเบียนเนื่องจากบ่อยครั้งมากที่คุณจะต้องใช้ "CALENDAR วันระหว่างวันที่สองวัน" ไม่ใช่เพียงแค่ "จำนวนช่วงเวลา 24 ชั่วโมง" ตัวอย่างเช่นคุณต้องแสดงป้ายกำกับ "X days ago" ในไทม์ไลน์ ในกรณีนี้ความแตกต่างระหว่าง "วันจันทร์ 23:59 น." และ "วันอังคาร 7:00 น." ควรเป็น "1 วัน (ที่ผ่านมา)" ... ดังนั้น.Dateส่วนนี้มีประโยชน์จริง ๆ หวังว่าฉันจะทำให้ตัวเองชัดเจน
อเล็กซ์

138

ใช้วัตถุ TimeSpan ซึ่งเป็นผลมาจากการลบวันที่:

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

2
เพิ่มขึ้นเพียงเพราะมันทำให้ชัดเจนว่า (d1 - d2) จะส่งคืนวัตถุ TimeSpan
Morvael

47

ฉันคิดว่านี่จะทำสิ่งที่คุณต้องการ:

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
จะได้รับวันในระหว่างในรูปแบบ DateTime? เพราะฉันต้องการแต่ละวันเพื่อแก้ไขฟิลด์ในตาราง :) แก้ไข: รับแล้วและโพสต์เป็นคำตอบด้านล่าง ขอบคุณ
sys_debug

4
DateTime xmas = ใหม่ DateTime (DateTime.Today.Year, 12, 25); จะทำให้ใช้งานได้ปีต่อปีไม่ใช่แค่ปี 2009 :)

1
ลบ () เป็น OperatorOverload สำหรับ DateTimes ดังนั้นมันจึงเหมือนกัน "(xmas - DateTime.Today) .TotalDays - อีกต่อไป
Marc

20

ในกรณีที่มีคนต้องการจำนวนวันทั้งคู่เป็นคู่ ( a, bของประเภทDateTime):

 (a.Date - b.Date).TotalDays

3
นี่จะเป็นจำนวนเต็มเสมอ (เช่น 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

นอกจากนี้คุณยังสามารถรับความแตกต่างในไม่กี่วินาที, มิลลิวินาทีและเห็บ


10

คุณสามารถลองสิ่งนี้

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

2
สิ่งนี้ช่วยฉันได้ดีที่สุดเนื่องจากความแตกต่างในวันที่ของฉันคือครึ่งวัน แต่เมื่ออเมริกาอยู่หลังออสเตรเลีย 1 วันฉันต้องดูว่ามีความแตกต่างในหนึ่งวัน คำตอบอื่น ๆ ที่กล่าวถึงในหัวข้อนี้แสดงให้เห็นว่าศูนย์หรือหมายเลขสองด้านล่าง 1 ซึ่งฉันไม่ต้องการ
Barry Guvenkaya

นี่คือคำตอบที่ดีที่สุดเมื่อมีวัตถุประสงค์เพื่อตรวจสอบว่าวันที่ผ่านไปแล้วในวันถัดไปไม่ว่าในแง่ของเวลาไม่ใช่วันที่ 24 ชั่วโมงเต็มหรือไม่
oneberenjena

4

สำหรับผู้เริ่มต้นอย่างฉันที่จะสะดุดปัญหาเล็ก ๆ นี้ในบรรทัดง่าย ๆ ด้วยการแปลงตัวอย่างเป็นint :

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

สิ่งนี้จะคำนวณจำนวนวันทั้งหมดตั้งแต่วันนี้ (DateTime.UtcNow.Date) เป็นวันที่ที่ต้องการ (myDateTime.Date)

ถ้า myDateTime เป็นวันวานหรือวันที่เก่ากว่าวันนี้จะให้ผลลัพธ์เป็นจำนวนเต็มบวก (+)

ในอีกด้านหนึ่งถ้า myDateTime เป็นวันพรุ่งนี้หรือวันที่ในอนาคตสิ่งนี้จะให้ผลลบ (-) จำนวนเต็มเนื่องจากกฎของการเพิ่ม

การเข้ารหัสที่มีความสุข! ^ _ ^


4

การใช้ไทม์แพนจะช่วยแก้ปัญหาเนื่องจากมีคุณสมบัติหลายอย่าง:

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

สำหรับaและbเป็นสองDateTimeประเภท:

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

ก่อนอื่นให้ประกาศคลาสที่จะกลับมาในภายหลัง:

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

ใช้ตัวควบคุมปุ่มเพื่อเรียกคลาสข้างต้น นี่คือตัวอย่าง:



0

รับความแตกต่างระหว่างวันที่สองวันจากนั้นรับวันจาก:

int total_days = (EndDate - StartDate).TotalDays

1
ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ โปรดอย่าพยายามทำให้รหัสของคุณแน่นเกินไปด้วยคำอธิบายที่อธิบายเนื่องจากจะช่วยลดความสามารถในการอ่านของทั้งรหัสและคำอธิบาย!
ลา StackExchange

2
TotalDays ส่งกลับค่าเป็นสองเท่า: msdn.microsoft.com/en-us/library/…ดังนั้นคุณต้องมีการแปลงเป็น 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;
    }
}   

21
รหัสนี้ผิดหลายวิธี! 1) รหัส Winforms จำนวนมากไม่เกี่ยวข้องกับคำถาม 2) วิธีการแสดงกล่องข้อความแบบใช้สาย (ฉันเดาว่าเป็นตัวควบคุมเว็บเบราเซอร์) 3) ใช้ตัวควบคุมเว็บเบราเซอร์เพื่อแสดงข้อความที่แสดงในป้ายกำกับแล้ว 4) การใช้ OperatorOverload Subtract () (ค่าเริ่มต้นสำหรับการดำเนินงาน "-") ซึ่งใช้สำหรับต่อไปหากคุณใช้ "MyDateA - MyDateB" 5) ไม่มีคำอธิบายถึงกองรหัสนี้
Marc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.