如何在C#中比较DateTime?


137

我不希望用户提供回溯日期或时间。

如何比较输入的日期和时间是否少于当前时间?

如果当前日期和时间是2010年6月17日下午12:25,我希望用户不能提供2010年6月17日之前的日期和下午12:25之前的时间。

就像我的函数一样,如果用户输入的时间是2010年6月16日且时间是12:24,则返回false

Answers:


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 '17

2
我发现您的答案很有价值,因为我正在寻找一些使用该代码的遗留代码
Erik Bergstedt


但是从调试的角度来看,MuSTaNG的答案更具可读性。
喜马拉雅山Garg

295

Microsoft还实现了运算符“ <”和“>”。因此,您可以使用它们来比较两个日期。

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

6
来源MSDN;这些文件被笨拙地标记为DateTime运算符,笨拙地标记为“ DateTime.Greater than”,“ DateTime.LessThanOrEqualTo” ..... msdn.microsoft.com/zh-cn/library/ff986512%28v=vs.90%29.aspx
Salman Siddiqui 2015年


2
我正在使用Unity 2017,并且使用此运算符对列表进行排序会给我错误的结果。我什至试图直接比较DateTime.ticks,但是也失败了。我必须使用DateTime.CompareTo才能获得正确的结果,但我不知道为什么。

2
错了 这无法以正确的方式比较UTC和本地时间。
Altiano Gerung

4
这不是完整的答案。将DateTime Kind用作ocnsideration时,应为date1.ToLocalTime() < DateTime.Nowdate1.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 + TimeSpanDateTime - TimeSpan
乔伊,

5

在一般情况下,你需要比较DateTimes具有相同Kind

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

从解释MSDNDateTime.Compare(这也是相关的运营商一样><==等):

为了确定t1与t2的关系,Compare方法比较t1和t2的Ticks属性,但忽略它们的Kind属性。在比较DateTime对象之前,请确保这些对象表示同一时区中的时间。

因此,简单的比较可能会在处理DateTimes不同时区时给出意外结果。


只是有一个虫子正因为如此...他们在做那个方法的时候在想:(
Legolas

3

如果您有两个看起来相同的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
他想比较DateTimestring
DANH

您可以将日期时间转换为字符串
Dieu Phan Dinh's

或者:您可以使用:DateTime.Compare(startDate,endDate)
Dieu Phan Dinh's

不是我的问题,这与Ahmet的区别吗?
丹,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中,“比较”通常表示“相对比较”,而不是“相等性检查”。这里的问题是关于相对比较的。此外,您不做任何努力来正确格式化代码。
Lasse V. Karlsen '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.