C#でDateTimeを比較する方法は?


137

ユーザーに過去の日付や時間を教えてほしくない。

入力した日時が現在の日時よりも短いかどうかを比較するにはどうすればよいですか?

現在の日付と時刻が2010年6月17日の午後12時25分である場合、ユーザーが2010年6月17日より前の日付と午後12時25分より前の時刻を指定できないようにします。

ユーザーが入力した時刻が2010年6月16日で、時刻が午後12時24分である場合、関数がfalseを返すように

回答:


179

MSDN:DateTime.Compare

DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0);
int result = DateTime.Compare(date1, date2);
string relationship;

if (result < 0)
   relationship = "is earlier than";
else if (result == 0)
   relationship = "is the same time as";         
else
   relationship = "is later than";

Console.WriteLine("{0} {1} {2}", date1, relationship, date2);
// The example displays the following output:
//    8/1/2009 12:00:00 AM is earlier than 8/1/2009 12:00:00 PM

3
あなたの答えは、日付が前か後かを知るだけでなく、違いが何かを確認する方法を提供します。もちろん、彼の答えはOPには適していますが、Googleからここに来た一部の人(自己完結型)にはあなたの答えが適しています。
levininja

2
私はこれが使用されている一部のレガシーコードを探していたので、私はあなたの答えは貴重な発見
エリックBergstedt


しかし、デバッグの観点からは、MuSTaNGの答えはより読みやすくなっています。
Himalaya Garg 2018

295

Microsoftは、演算子「<」と「>」も実装しています。したがって、これらを使用して2つの日付を比較します。

if (date1 < DateTime.Now)
   Console.WriteLine("Less than the current time!");

6
ソースMSDN; これらは、 "DateTime.Greater than"、 "DateTime.LessThanOrEqualTo" ..... msdn.microsoft.com/en-us/library/ff986512%28v=vs.90%29.aspx
サルマン・シディキ

現在の.NETバージョン:msdn.microsoft.com/en-us/library/ff986512
v

2
Unity 2017を使用していますが、この演算子を使用してリストをソートすると、間違った結果が返されます。DateTime.ticksを直接比較しようとしても失敗しました。適切な結果を得るには、DateTime.CompareToを使用する必要がありましたが、その理由はわかりません。
lin

2
これは間違っています。これは、UTCと現地時間を正しい方法で比較することはできません。
Altiano Gerung、2018

4
これは完全な答えではありません。DateTime Kindを考慮に入れる場合は、date1.ToLocalTime() < DateTime.Nowまたはのいずれかでなければなりませんdate1.ToUniversalTime() < DateTime.UtcNow
ユリスラフ2018

21

MuSTaNGの答えはすべてを語っていますが、リンクなどを含めて少し複雑にするために、まだ追加しています。


従来のオペレーター

DateTime.NET Framework 1.1以降で使用できます。また、DateTime従来の演算子+とを使用して、オブジェクトの加算と減算を行うこともでき-ます。

MSDNからの一例:

平等:
System.DateTime april19 = new DateTime(2001, 4, 19);
System.DateTime otherDate = new DateTime(1991, 6, 5);

// areEqual gets false.
bool areEqual = april19 == otherDate;

otherDate = new DateTime(2001, 4, 19);
// areEqual gets true.
areEqual = april19 == otherDate;

他の演算子も同様に使用できます。

以下は、で使用可能なすべての演算子のリストですDateTime


1
回答を編集して詳細に説明することもできます。いずれにせよ、あなたが使用することはできません+2つのためにDateTimeあなたが行うことができ、オペランドDateTime - DateTime、またはDateTime + TimeSpan、またはDateTime - TimeSpan
Joey、

5

一般的にDateTimes同じものと比較する必要がありますKind

if (date1.ToUniversalTime() < date2.ToUniversalTime())
    Console.WriteLine("date1 is earlier than date2");

説明MSDN程度DateTime.Compare(これは、事業者が好きにも関連して><==およびなど):

t1とt2の関係を判断するために、Compareメソッドはt1とt2のTicksプロパティを比較しますが、Kindプロパティは無視します。DateTimeオブジェクトを比較する前に、オブジェクトが同じタイムゾーンの時間を表していることを確認してください。

したがって、単純な比較ではDateTimes、異なるタイムゾーンで表されているものを処理するときに予期しない結果が生じる可能性があります。


このためにバグがあっただけです...彼らがその方法を作ったときに彼らは考えていましたか:(
Legolas '11

3

同じように見える2つのDateTimeがあるが、CompareまたはEqualsが期待した結果を返さない場合、これがそれらを比較する方法です。

以下は1ミリ秒の精度の例です。

bool areSame = (date1 - date2) > TimeSpan.FromMilliseconds(1d);

1
//Time compare.
private int CompareTime(string t1, string t2)
{
    TimeSpan s1 = TimeSpan.Parse(t1);
    TimeSpan s2 = TimeSpan.Parse(t2);
    return s2.CompareTo(s1);
}

2
彼は比較したくDateTimeないstring
Danh

日時を文字列に変換できます
Dieu Phan Dinh

または:使用できます:DateTime.Compare(startDate、endDate)
Dieu Phan Dinh

私の問題ではなく、それはアフメットのものとの違いですか?
Danh 2016年

0

Unity環境での典型的な簡単な例を示します

using UnityEngine;

public class Launch : MonoBehaviour
{
    void Start()
    {
        Debug.Log("today " + System.DateTime.Now.ToString("MM/dd/yyyy"));

        // don't allow the app to be run after June 10th
        System.DateTime lastDay = new System.DateTime(2020, 6, 10);
        System.DateTime today = System.DateTime.Now;

        if (lastDay < today) {
            Debug.Log("quit the app");
            Application.Quit();
        }
        UnityEngine.SceneManagement.SceneManager.LoadScene("Welcome");
    }
}

-3
public static bool CompareDateTimes(this DateTime firstDate, DateTime secondDate) 
{
   return firstDate.Day == secondDate.Day && firstDate.Month == secondDate.Month && firstDate.Year == secondDate.Year;
}

4
.NETでは、「比較」は通常「相対比較」を意味し、「等価性チェック」を意味しません。ここでの問題は、相対的な比較についてでした。さらに、コードを適切にフォーマットするための努力もしていません。
ラッセV.カールセン2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.