두 날짜 간의 차이를 계산합니까 (일수)?


1092

이 질문은 Java , JavaScriptPHP 에 대해서는 답변 되었지만 C #에는 해당되지 않습니다. 그렇다면 C #에서 두 날짜 사이의 일 수를 어떻게 계산할 수 있습니까?


7
나는 이것이 꽤 유용하다는 것을 알았습니다 .. 시작 날짜와 종료 날짜 사이의 날짜 목록 가져 오기 이것은 미래에 특히 이것을 찾는 사람에게 도움이
되기를

더하기 및 빼기 연산자는 예상대로 DateTimeTimeSpan유형에 대해 오버로드됩니다 . 모두 매우 간단합니다. -어떤 정확한 문제가 발생 했습니까?
BrainSlugs83

답변:


2013

가정 StartDate하고 EndDate유형 DateTime:

(EndDate - StartDate).TotalDays

549
이 대답은 분명히 맞지만 부분 일 차이를 십진수로 나타내지 않고 (a - b).Days총 일수에 관심이있는 경우 에도 사용할 수 있습니다 . intdouble
PFranchise

25
이것은 08 / 31 / 2013-08 / 01 / 2013 = 31보다 적은 1 일을 리턴하지만 30 만 리턴합니다.
JRB

60
@JasRajBishnoi-수학을 확인하고 싶을 수도 있습니다. 31-1은 무엇입니까?
Greg Beech

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을 의미하며 이는 2013 년 8 월 31 일이 30 일이므로 왜 30 일인지 설명합니다. 막 시작했습니다. 또한 DateTime 속성 / 필드에서 쿼리 할 때 범위를 가져 오는 적절한 조건이 "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)"인 이유를 설명합니다.
Miguel Veloso

160

가장 좋은 대답은 맞지만 전체 날짜를 int로만 사용하고 날짜의 시간 구성 요소를 잊어 버린 경우 다음을 고려하십시오.

(EndDate.Date - StartDate.Date).Days

다시 가정 StartDate하고 EndDate유형 DateTime입니다.


7
"일수"는 일반적으로 하루를 의미 하기 때문에 가장 좋은 대답 입니다. 그것의 가치는 그 지적 Days365에서 멈추지 않는다 (같은 다른 속성으로 Hours, Minutes, Second다음으로 높은 특성이 시작되는 곳이다 NaX 형있는 값). 그것과 동일 TotalDays하지만 하루의 분수가없고 int대신에 돌아 옵니다 double.
Tim Schmelter

항상 예상대로 작동합니까? 예를 들어, 비교되는 요일 중 하나가 "스프링 앞서"일광 절약 시간 일인 경우 빼기에서 23 시간의 TimeSpan을 생성 할 수 있으며, 그렇다면 23 시간 시간의 .Days 값은 0입니다. ? (-이와 함께 자신을 실험했는데, 내 결과 지금까지 확정적이지 stackoverflow.com/questions/43644252/... )
존 슈나이더

그래, 이것이 내가 필요한 것-이제 가장 귀중한 답변 cmon은 아무도 계산 일에 분과 초에 대해 생각하고
싶지 않습니다

1,5 일만 지나면이 기능이 1 일만 표시됩니까? 이틀을 표시하도록 어떻게 변경할 수 있습니까? 나는 항상 + 1 일을 추가해야합니까?
CDrosos

2
"24 시간 간격"뿐만 아니라 "두 날짜 사이의 달력 일"이 매우 자주 필요하기 때문에이를지지합니다. 예를 들어 타임 라인에 "X days ago"레이블을 표시해야합니다. 이 경우 "월요일 오후 11:59"와 "화요일 오전 7시"의 차이는 "1 일 (ago)"이어야합니다. 따라서이 .Date부분은 정말 유용합니다. 내가 분명해
Alex

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 = new DateTime (DateTime.Today.Year, 12, 25); 2009 년이 아니라 매년 단위로 작동하도록 만들 것입니다. :)

1
Subtract ()는 DateTimes에 대한 OperatorOverload이므로 동일한 "(xmas-DateTime.Today) .TotalDays-더 길다
Marc

20

누군가 하루 종일 숫자를 이중 ( a, b유형 DateTime) 으로 원할 경우 :

 (a.Date - b.Date).TotalDays

3
Date 부분이 항상 자정이므로 항상 정수 (예 : 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 일 뒤 떨어진 경우 실제로 하루 차이가 있음을 확인해야합니다. 이 스레드에서 언급 한 다른 답변은 필요하지 않은 0 또는 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

들어 ab이 개 같은 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 DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

0

두 날짜의 차이를 얻은 다음 다음 날짜를 가져옵니다.

int total_days = (EndDate - StartDate).TotalDays

1
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다. 코드와 설명의 가독성을 떨어 뜨리므로 설명 주석으로 코드를 혼동하지 마십시오!
Goodbye StackExchange

2
TotalDays는 double을 반환합니다. 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) (WebBrowser 컨트롤이라고 생각합니다)를 사용하여 메시지 상자를 표시하는 유선 방법. 3) WebBrowser 컨트롤을 사용하여 레이블에 이미 표시된 텍스트를 표시합니다. 4) "MyDateA-MyDateB"를 수행하는 경우 사용되는 OperatorOverload Subtract () ( "-"작업의 기본값) 사용. 5)이 코드 더미에 대한 설명은 없습니다.
Marc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.