2つの日付の差(日数)を計算しますか?


1093

この質問はJavaJavaScript、およびPHPでは回答されているが、C#では回答されていないようです。では、C#で2つの日付の間の日数を計算するにはどうすればよいでしょうか。


7
これは本当に便利だと思いました.. 開始日と終了日の間の日付のリストを取得するこれが特にこれを探している人に役立つことを願っています:)
sys_debug

予想どおり、加算演算子と減算演算子がDateTimeand TimeSpan型に対してオーバーロードされます。それはすべて非常に簡単です。-どのような問題が発生しましたか?
BrainSlugs83 2018

回答:


2013

と仮定StartDateEndDate、タイプDateTimeです:

(EndDate - StartDate).TotalDays

549
この答えは明らかに正しい(a - b).Daysですが、部分的な日差の10進表記ではintなく、合計日数に関心がある場合にも使用できますdouble
PFranchise

25
これは1日少ない08/31 / 2013-08 / 01/2013 = 31を返しますが、これは30のみを返します。
JRB 2013

60
@JasRajBishnoi-あなたはあなたの数学をチェックしたいかもしれません。31-1とは何ですか?
グレッグブナ2013

33
JasRajは、両方の日付を含めると、差が1日少ないという意味でも正しかったです。それはすべて視点に依存します。
Fahad Abid Janjua 2013

28
@FahadAbidJanjuaそれは問題や視点ではなく、時間の問題です。つまり、日付の時間の部分です。2013年8月31日-2013年8月1日は、実際には2013年8月31日00:00:00-2013年8月1日00:00:00を意味します。ちょうど始めています。これは、DateTimeプロパティ/フィールドに対してクエリを実行するときに、範囲を取得するための適切な条件が "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays(1)"
Miguel Veloso

160

正解は正解ですが、intとしてWHOLE日のみが必要で、日付の時間コンポーネントを忘れてもよい場合は、次のことを考慮してください。

(EndDate.Date - StartDate.Date).Days

再び仮定しStartDateEndDateタイプDateTimeです。


7
「日数」は通常丸1日を意味するため、最良の回答です。それの価値があることは注目にDays(のような他の特性として、365で停止していないHoursMinutesSecond次に高いプロパティが始まる場所NAX値です)。と同じTotalDaysですが、1日の端数がintなく、の代わりに戻りますdouble
Tim Schmelter 2017年

これは常に期待どおりに機能しますか?たとえば、比較されている日の1つが「春先」の夏時間の日である場合、減算により23時間のTimeSpanが生成され、そうであれば、その23時間のタイムスパンの.Daysの値は0になります。 ?(私はこれで自分を試してみましたが、私の結果はこれまでのところ決定的です- stackoverflow.com/questions/43644252/...
ジョン・シュナイダー

うん、これは私が必要としたものです-最も価値のある答えcmonは、日を計算する際に分と秒について考えたくありません
solujic

1.5日しか経過していない場合、この.Days関数は1日のみを表示しますか?2日を表示するように変更するにはどうすればよいですか?常に+ 1日追加する必要があるだけですか?
CDrosos

2
これを支持する理由は、「24時間間隔の数」だけでなく、「2つの日付の間に暦日」が必要になることが非常に多いためです。たとえば、タイムラインに「X日前」のラベルを表示する必要があります。この場合、「月曜日の午後11時59分」と「火曜日の午前7時」の差は「1日(前)」になるはず.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
.TotalDays -ちょうど長い。 -減算()は、その同じ「(DateTime.Todayクリスマス)ので、日時のOperatorOverloadある
マルク・

20

誰かが丸一日の数値をdouble(abDateTime)として必要とする場合:

 (a.Date - b.Date).TotalDays

3
ただし、日付部分は常に午前0時であるため、これは常に整数になります(つまり、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日の差があることを確認する必要があります。このスレッドで言及されている他の回答は、私が必要としないゼロまたは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

ab2つのように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

2つの日付の差を取得し、次の日付を取得します。

int total_days = (EndDate - StartDate).TotalDays

1
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。また、コードと説明の両方の読みやすさが低下するため、コードを説明コメントで混雑させないようにしてください。
さようならStackExchange

2
TotalDaysはdoubleを返します:msdn.microsoft.com/en-us/library/…したがって、intへの変換が必要です
qnguyen 2018年

-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)このコードの山の説明はありません。
マーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.