Як порівняти DateTime в C #?


137

Я не хочу, щоб користувач вказував дату чи час назад.

Як я можу порівняти, якщо введена дата та час менші, ніж поточний час?

Якщо поточна дата та час - 17-червня-2010, 12:25, я хочу, щоб користувач не міг дати дату до 17 червня -2010 та час до 12:25.

Як і моя функція, повертається помилково, якщо час, введений користувачем, 16 червня-2010 та час 12:24

Відповіді:


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
Ваша відповідь дає спосіб побачити, в чому різниця, а не просто знати, що дата - до чи після. Звичайно, його відповідь краще для ОП, але ваша - краща для деяких людей, які потрапили сюди з google (включено самостійно).
levininja

2
Я вважаю вашу відповідь цінною, тому що я переглядаю якийсь спадковий код, де це використовується
Ерік Бергштедт


Але з точки зору налагодження відповідь MuSTaNG є більш зрозумілою.
Гімалая Гарг

295

Microsoft також впровадила оператори '<' і '>'. Тому ви використовуєте їх для порівняння двох дат.

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

6
Джерело MSDN; вони задокументовані як оператори DateTime, незграбно позначені як "DateTime.Greater than", "DateTime.LessThanOrEqualTo" ..... msdn.microsoft.com/en-us/library/ff986512%28v=vs.90%29.aspx
Салман Сиддікі


2
Я використовую Unity 2017 і використання цього оператора для сортування списків дає мені неправильні результати. Я навіть намагався безпосередньо порівняти DateTime.ticks, і це теж не вдалося. Мені довелося використовувати DateTime.CompareTo, щоб досягти правильних результатів, і я не знаю чому.
лайн

2
Це неправильно. Це не може порівняти UTC та місцевий час правильним чином.
Altiano Gerung

4
Це не повна відповідь. Під час прийому DateTime Kind на розгляд, він повинен бути date1.ToLocalTime() < DateTime.Nowабо date1.ToUniversalTime() < DateTime.UtcNow.
Юріслав

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.
Джої,

5

У загальному випадку вам потрібно порівняти DateTimesте саме Kind:

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

Пояснення від MSDN про DateTime.Compare(Це також актуально для операторів , таких як >, <, ==і т.д.):

Для визначення співвідношення t1 до t2 метод Порівняння порівнює властивість Ticks t1 і t2, але ігнорує їх властивість Kind . Перш ніж порівнювати об’єкти DateTime, переконайтеся, що об’єкти відображають час у одному часовому поясі.

Таким чином, просте порівняння може дати несподіваний результат при роботі з DateTimesтим, що представлені в різних часових поясах.


Просто через це виникло помилка ... що думали, коли застосовували цей метод :(
Legolas

3

Якщо у вас є два 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
Данина

ви можете конвертувати дату в рядок
Dieu Phan Dinh

або: ви можете використовувати: DateTime.Compare (startDate, endDate)
Dieu Phan Dinh

Чи не моя проблема, і чи це відмінність від Ахмета ?
Дан

0

Ось типовий простий приклад у середовищі «Єдність»

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 "Порівняння" зазвичай означає "відносне порівняння", а не "перевірку рівності". Питання тут стосувалося відносного порівняння. Крім того, ви не докладали зусиль для того, щоб правильно відформатувати код.
Лассе В. Карлсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.