Bagaimana cara memeriksa apakah satu DateTime lebih besar dari yang lain di C #


105

Saya memiliki dua DateTimeobjek: StartDatedan EndDate. Saya ingin memastikan StartDatesebelumnya EndDate. Bagaimana ini dilakukan di C #?

Jawaban:


210
if (StartDate < EndDate)
   // code

jika Anda hanya menginginkan tanggal, dan bukan waktu

if (StartDate.Date < EndDate.Date)
    // code

27
if(StartDate < EndDate)
{}

DateTime mendukung operator perbandingan normal.



23

Anda dapat menggunakan operator <atau> yang kelebihan beban.

Sebagai contoh:

DateTime d1 = new DateTime(2008, 1, 1);
DateTime d2 = new DateTime(2008, 1, 2);
if (d1 < d2) { ...

8
if (StartDate>=EndDate)
{
    throw new InvalidOperationException("Ack!  StartDate is not before EndDate!");
}



5

Ini mungkin sudah terlambat, tetapi untuk memberi manfaat bagi orang lain yang mungkin tersandung pada ini, saya menggunakan metode ekstensi lakukan untuk ini menggunakan IComparableseperti ini:

public static class BetweenExtension
    {
        public static bool IsBetween<T>(this T value, T min, T max) where T : IComparable
        {
            return (min.CompareTo(value) <= 0) && (value.CompareTo(max) <= 0);
        }
    }

Menggunakan metode ekstensi ini dengan IComparablemembuat metode ini lebih umum dan membuatnya dapat digunakan dengan berbagai tipe data dan bukan hanya tanggal.

Anda akan menggunakannya seperti ini:

DateTime start = new DateTime(2015,1,1);
DateTime end = new DateTime(2015,12,31);
DateTime now = new DateTime(2015,8,20);

if(now.IsBetween(start, end))
{
     //Your code here
}

3

Saya memiliki persyaratan yang sama, tetapi ketika menggunakan jawaban yang diterima, itu tidak memenuhi semua tes unit saya. Masalahnya bagi saya adalah ketika Anda memiliki objek baru, dengan tanggal Mulai dan Akhir dan Anda harus menetapkan tanggal Mulai (pada tahap ini tanggal Akhir Anda memiliki nilai tanggal minimum 01/01/0001) - solusi ini lulus semua tes unit saya:

    public DateTime Start
    {
        get { return _start; }
        set
        {
            if (_end.Equals(DateTime.MinValue))
            {
                _start = value;
            }
            else if (value.Date < _end.Date)
            {
                _start = value;
            }
            else
            {
                throw new ArgumentException("Start date must be before the End date.");
            }
        }
    }


    public DateTime End
    {
        get { return _end; }
        set
        {
            if (_start.Equals(DateTime.MinValue))
            {
                _end = value;
            }
            else if (value.Date > _start.Date)
            {
                _end = value;
            }
            else
            {
                throw new ArgumentException("End date must be after the Start date.");
            }
        }
    }

Itu melewatkan kasus tepi di mana tanggal Mulai dan Akhir bisa 01/01/0001 tetapi saya tidak khawatir tentang itu.


2
        if (new DateTime(5000) > new DateTime(1000))
        {
            Console.WriteLine("i win");
        }

0

Saya ingin menunjukkan bahwa jika Anda mengonversi ke .Date, Anda tidak perlu khawatir tentang jam / menit / detik dll:

    [Test]
    public void ConvertToDateWillHaveTwoDatesEqual()
    {
        DateTime d1 = new DateTime(2008, 1, 1);
        DateTime d2 = new DateTime(2008, 1, 2);
        Assert.IsTrue(d1 < d2);

        DateTime d3 = new DateTime(2008, 1, 1,7,0,0);
        DateTime d4 = new DateTime(2008, 1, 1,10,0,0);
        Assert.IsTrue(d3 < d4);
        Assert.IsFalse(d3.Date < d4.Date);
    }
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.