Bagaimana cara membandingkan DateTime dalam C #?


137

Saya tidak ingin pengguna memberikan tanggal atau waktu kembali.

Bagaimana saya bisa membandingkan jika tanggal dan waktu yang dimasukkan kurang dari waktu sekarang?

Jika tanggal dan Waktu saat ini adalah 17-Jun-2010, 12:25, saya ingin pengguna tidak dapat memberikan tanggal sebelum 17 Jun -2010 dan waktu sebelum 12:25.

Seperti fungsi saya return false jika waktu yang dimasukkan oleh pengguna adalah 16-Jun-2010 dan waktu 12:24 PM

Jawaban:


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
Jawaban Anda memberikan cara untuk melihat perbedaannya alih-alih hanya mengetahui bahwa tanggalnya sebelum atau sesudah. Tentu saja jawabannya lebih baik untuk OP, tetapi jawaban Anda lebih baik untuk beberapa orang yang datang ke sini dari google (termasuk diri sendiri).
levininja

2
Saya menemukan jawaban Anda berharga karena saya melihat beberapa kode warisan tempat ini digunakan
Erik Bergstedt

Berikut ini tautan MSDN
Harsh Raj

Tetapi dari sudut pandang debug, jawaban MuSTaNG lebih mudah dibaca.
Himalaya Garg

295

Microsoft juga telah mengimplementasikan operator '<' dan '>'. Jadi Anda menggunakan ini untuk membandingkan dua tanggal.

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

6
Sumber MSDN; ini didokumentasikan sebagai Operator DateTime canggung dilabeli sebagai "DateTime.Lebih baik daripada", "DateTime.LessThanOrEqualTo" ..... msdn.microsoft.com/en-us/library/ff986512%28v=vs.90%29.aspx
Salman Siddiqui


2
Saya menggunakan Unity 2017 dan menggunakan operator ini untuk mengurutkan daftar memberi saya hasil yang salah. Saya bahkan mencoba membandingkan DateTime.ticks secara langsung dan itu juga gagal. Saya harus menggunakan DateTime.CompareTo untuk mendapatkan hasil yang benar dan saya tidak tahu mengapa.
lin

2
Ini salah. Ini tidak dapat membandingkan UTC dan Waktu Lokal dengan cara yang benar.
Altiano Gerung

4
Ini bukan jawaban yang lengkap. Saat mengambil Jenis DateTime ke pertimbangan, itu harus berupa date1.ToLocalTime() < DateTime.Nowatau date1.ToUniversalTime() < DateTime.UtcNow.
yurislav

21

Jawaban MuSTaNG mengatakan itu semua, tapi saya masih menambahkannya untuk membuatnya sedikit lebih rumit, dengan tautan dan semuanya.


Operator konvensional

tersedia untuk DateTimesejak .NET Framework 1.1. Juga, penambahan dan pengurangan DateTimeobjek juga dimungkinkan menggunakan operator konvensional +dan -.

Satu contoh dari MSDN:

Persamaan:
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;

Operator lain dapat digunakan juga.

Berikut adalah daftar semua operator yang tersedia untuk DateTime.


1
Anda bisa mengedit jawaban mereka untuk menguraikan. Bagaimanapun, Anda tidak dapat menggunakan +untuk dua DateTimeoperan, Anda dapat melakukan DateTime - DateTime, atau DateTime + TimeSpan, atau DateTime - TimeSpan.
Joey

5

Secara umum, Anda perlu membandingkan DateTimesdengan yang sama Kind:

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

Penjelasan dari MSDN tentang DateTime.Compare(ini juga relevan untuk operator seperti >, <, ==dan lain-lain):

Untuk menentukan hubungan t1 ke t2, metode Bandingkan membandingkan properti Ticks dari t1 dan t2 tetapi mengabaikan properti Kind mereka . Sebelum membandingkan objek DateTime, pastikan bahwa objek mewakili waktu di zona waktu yang sama.

Dengan demikian, perbandingan sederhana dapat memberikan hasil yang tidak terduga ketika berhadapan dengan DateTimesyang diwakili dalam zona waktu yang berbeda.


Baru saja ada bug karena ini ... dengan apa mereka berpikir ketika mereka membuat metode itu :(
Legolas

3

Jika Anda memiliki dua DateTime yang terlihat sama, tetapi Bandingkan atau Setara tidak mengembalikan apa yang Anda harapkan, ini adalah bagaimana membandingkannya.

Berikut ini contoh dengan presisi 1 milidetik:

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
Dia ingin membandingkan DateTimetidakstring
Danh

Anda dapat mengonversi datetime ke string
Dieu Phan Dinh

atau: Anda dapat menggunakan: DateTime.Compare (startDate, endDate)
Dieu Phan Dinh

Bukan masalah saya dan apakah ini berbeda dari Ahmet ?
Danh

0

Berikut adalah contoh sederhana khas di lingkungan Persatuan

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
Di .NET, "Bandingkan" biasanya berarti "perbandingan relatif" dan bukan "pemeriksaan kesetaraan". Pertanyaannya di sini adalah tentang perbandingan relatif. Selain itu Anda tidak berusaha memformat kode dengan benar.
Lasse V. Karlsen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.