วิธีเปรียบเทียบ DateTime ใน C #?


140

ฉันไม่ต้องการให้ผู้ใช้ระบุวันที่หรือเวลาย้อนหลัง

ฉันจะเปรียบเทียบได้อย่างไรว่าวันที่และเวลาที่ป้อนน้อยกว่าเวลาปัจจุบัน?

หากวันที่และเวลาปัจจุบันคือ 17 มิ.ย. 2553 12:25 น. ฉันต้องการให้ผู้ใช้ไม่สามารถบอกวันที่ก่อน 17 มิ.ย. -2010 และเวลาก่อน 12:25 น.

เช่นเดียวกับฟังก์ชันของฉันส่งคืนเท็จหากเวลาที่ผู้ใช้ป้อนคือ 16 มิ.ย. 2553 และเวลา 12:24 น

คำตอบ:


184

MSDN: DateTime เปรียบเทียบ

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

4
คำตอบของคุณให้วิธีดูว่าความแตกต่างคืออะไรแทนที่จะรู้ว่าวันที่นั้นอยู่ก่อนหรือหลัง แน่นอนคำตอบของเขาดีกว่าสำหรับ OP แต่ของคุณดีกว่าสำหรับบางคนที่มาจาก google (รวมตัวเอง)
levininja

2
ฉันพบว่าคำตอบของคุณมีค่าเพราะฉันกำลังดูรหัสเดิมที่ใช้อยู่
Erik Bergstedt

นี่คือลิงค์ MSDN
Harsh Raj

แต่จากมุมมองของการแก้ปัญหาคำตอบของ MuSTaNG นั้นอ่านได้ง่ายกว่า
Himalaya Garg

ดูคำตอบของฉันด้านล่างสำหรับรหัสยูทิลิตี้ซึ่งแสดงความแตกต่างระหว่างวันที่สองวัน นอกจากนี้ยังช่วยให้สามารถเปรียบเทียบวันที่ได้ถึงจุดหนึ่งเท่านั้นเช่นไม่รวมมิลลิวินาทีหรือเปรียบเทียบเฉพาะ Y / M / D หรือวัน - ชั่วโมง - นาที ...
cskwg

303

ไมโครซอฟต์ได้ใช้ตัวดำเนินการ '<' และ '>' ด้วย คุณจึงใช้สิ่งเหล่านี้เพื่อเปรียบเทียบวันที่สองวัน

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

7
ที่มา MSDN; เอกสารเหล่านี้จัดทำเป็น DateTime Operators อย่างเชื่องช้าเป็น "DateTime.Greater than", "DateTime.LessThanOrEqualTo" ..... msdn.microsoft.com/en-us/library/ff986512%28v=vs.90%29.aspx
Salman Siddiqui

NET เวอร์ชันปัจจุบัน: msdn.microsoft.com/en-us/library/ff986512(v=vs.110).aspx
juFo

2
ฉันใช้ Unity 2017 และการใช้โอเปอเรเตอร์นี้เพื่อจัดเรียงรายการทำให้ฉันได้ผลลัพธ์ที่ไม่ถูกต้อง ฉันพยายามเปรียบเทียบ DateTime.ticks โดยตรงและก็ล้มเหลวเช่นกัน ฉันต้องใช้ DateTime.CompareTo เพื่อให้ได้ผลลัพธ์ที่ถูกต้องและฉันไม่รู้ว่าทำไม
lin

2
นี่เป็นสิ่งที่ไม่ถูกต้อง สิ่งนี้ไม่สามารถเปรียบเทียบ UTC และเวลาท้องถิ่นได้อย่างถูกต้อง
Altiano Gerung

5
นี่ไม่ใช่คำตอบที่สมบูรณ์ เมื่อถ่าย DateTime ชนิดเพื่อ ocnsideration มันควรจะเป็นอย่างใดอย่างหนึ่งหรือdate1.ToLocalTime() < DateTime.Now date1.ToUniversalTime() < DateTime.UtcNow
yurislav

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
คุณสามารถแก้ไขคำตอบให้ละเอียดได้ ในกรณีที่คุณไม่สามารถใช้+สองDateTimeตัวถูกดำเนินการ, คุณสามารถทำได้DateTime - DateTimeหรือหรือDateTime + TimeSpan DateTime - TimeSpan
Joey

6

โดยทั่วไปคุณต้องเปรียบเทียบDateTimesกับสิ่งเดียวกันKind:

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

คำอธิบายจากMSDNเกี่ยวกับDateTime.Compare(นอกจากนี้ยังมีความเกี่ยวข้องสำหรับผู้ประกอบการเช่น>, <, ==และอื่น ๆ ):

เพื่อตรวจสอบความสัมพันธ์ของ T1 ไป T2 วิธีเปรียบเทียบเปรียบเทียบเห็บทรัพย์สินของ T1 และ T2 แต่ละเว้นคุณสมบัติชนิดของพวกเขา ก่อนที่จะเปรียบเทียบวัตถุ DateTime ตรวจสอบให้แน่ใจว่าวัตถุแสดงเวลาในเขตเวลาเดียวกัน

ดังนั้นการเปรียบเทียบอย่างง่ายอาจให้ผลลัพธ์ที่ไม่คาดคิดเมื่อจัดการกับDateTimesสิ่งนั้นที่แสดงในเขตเวลาที่ต่างกัน


เพิ่งมีข้อผิดพลาดเพราะสิ่งนี้ ... พวกเขากำลังคิดเมื่อทำวิธีนั้น :(
Legolas

4

หากคุณมี DateTime สองวันที่ดูเหมือนกัน แต่การเปรียบเทียบหรือเท่ากับไม่ให้ผลลัพธ์ตามที่คุณคาดหวังนี่คือวิธีเปรียบเทียบ

ตัวอย่างที่มีความแม่นยำ 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

ไม่ใช่ปัญหาของฉันและมันแตกต่างจากAhmetหรือไม่?
Danh

0

นี่คือตัวอย่างง่ายๆทั่วไปใน Unity milieu

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");
    }
}

0
using System;
//
public enum TimeUnit : byte {
    Unknown = 0x00, // 
    Nanosecond = 0x01, // ns, not available in DateTime
    Millisecond = 0x02, // ms
    Second = 0x04, // sec
    Minute = 0x08, // min
    Hour = 0x10, // h
    Day = 0x20, // d
    Month = 0x40, // M
    Year = 0x80, // Y
    AllDate = TimeUnit.Year | TimeUnit.Month | TimeUnit.Day,
    AllTime = TimeUnit.Hour | TimeUnit.Minute | TimeUnit.Second,
    UpToNanosecond = TimeUnit.Nanosecond | TimeUnit.Millisecond | TimeUnit.Second | TimeUnit.Minute | TimeUnit.Hour | TimeUnit.Day | TimeUnit.Month | TimeUnit.Year,
    UpToMillisecond = TimeUnit.Millisecond | TimeUnit.Second | TimeUnit.Minute | TimeUnit.Hour | TimeUnit.Day | TimeUnit.Month | TimeUnit.Year,
    UpToSecond = TimeUnit.Second | TimeUnit.Minute | TimeUnit.Hour | TimeUnit.Day | TimeUnit.Month | TimeUnit.Year,
    UpToMinute = TimeUnit.Minute | TimeUnit.Hour | TimeUnit.Day | TimeUnit.Month | TimeUnit.Year,
    UpToHour = TimeUnit.Hour | TimeUnit.Day | TimeUnit.Month | TimeUnit.Year,
    UpToDay = TimeUnit.Day | TimeUnit.Month | TimeUnit.Year,
    UpToMonth = TimeUnit.Month | TimeUnit.Year,
};
//
public static partial class DateTimeEx {
    //
    private static void _Compare( ref int result, int flags, TimeUnit tu, int a, int b ) {
        var which = (int) tu;
        if ( 0 != ( flags & which ) ) {
            if ( a != b ) result |= which;
        }
    }
    ///<summary>Compare Dates. The returned TimeUnit will have one flag set for every different field. It will NOT indicate which date is bigger or smaller.</summary>
    public static TimeUnit Compare( this DateTime a, DateTime b, TimeUnit unit ) {
        int result = 0;
        var flags = (int) unit;
        //ompare( ref result, flags, TimeUnit.Nanosecond, a.Nano, b.Nanosecond );
        _Compare( ref result, flags, TimeUnit.Millisecond, a.Millisecond, b.Millisecond );
        _Compare( ref result, flags, TimeUnit.Second, a.Second, b.Second );
        _Compare( ref result, flags, TimeUnit.Minute, a.Minute, b.Minute );
        _Compare( ref result, flags, TimeUnit.Hour, a.Hour, b.Hour );
        _Compare( ref result, flags, TimeUnit.Day, a.Day, b.Day );
        _Compare( ref result, flags, TimeUnit.Month, a.Month, b.Month );
        _Compare( ref result, flags, TimeUnit.Year, a.Year, b.Year );
        return (TimeUnit) result;
    }
}
public static class Tests {
    //
    private static void TestCompare() {
        var test = DateTime.UtcNow;
        var ts = test.ToUnixTimestamp( true );
        var test2 = DateTimeEx.ToDateTime( ts, true );
        var ok = 0 == DateTimeEx.Compare( test, test2, TimeUnit.UpToSecond );
        Log.Assert( ok );
        ts = test.ToUnixTimestamp( false );
        test2 = DateTimeEx.ToDateTime( ts, false );
        ok = 0 == DateTimeEx.Compare( test, test2, TimeUnit.UpToSecond );
        Log.Assert( ok );
    }
}

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

5
ใน. NET คำว่า "Compare" มักจะหมายถึง "การเปรียบเทียบแบบสัมพัทธ์" ไม่ใช่ "การตรวจสอบความเท่าเทียมกัน" คำถามที่นี่เกี่ยวกับการเปรียบเทียบแบบสัมพัทธ์ นอกจากนี้คุณไม่ได้พยายามจัดรูปแบบโค้ดให้ถูกต้อง
Lasse V.Karlsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.