Как сравнить DateTime в C #?


137

Я не хочу, чтобы пользователь сообщал дату или время.

Как я могу сравнить, если введенные дата и время МЕНЬШЕ, чем текущее время?

Если текущая дата и время - 17 июня 2010 г., 12:25, я хочу, чтобы пользователь не мог указать дату до 17 июня-2010 г. и время до 12:25.

Как и моя функция, возвращает false, если время, введенное пользователем, - 16 июня 2010 года, а время 12:24.

Ответы:


180

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 (включая себя).
Левининя

2
Я нашел ваш ответ ценным, потому что я смотрю на какой-то устаревший код, в котором он используется
Эрик Бергстедт


Но с точки зрения отладки ответ MuSTaNG более читабелен.
Гималаи Гарг

296

Microsoft также реализовала операторы «<» и «>». Таким образом, вы используете их для сравнения двух дат.

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

7
Источник 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, чтобы получить правильные результаты, и я не знаю почему.
lin

2
Это не верно. Это не может сравнить UTC и местное время в правильном направлении.
Альтиано Герунг,

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.
Joey

5

В общем случае нужно сравнивать DateTimesс таким же Kind:

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

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

Чтобы определить отношение t1 к t2, метод Compare сравнивает свойство Ticks для t1 и t2, но игнорирует их свойство Kind . Перед сравнением объектов DateTime убедитесь, что объекты представляют время в одном часовом поясе.

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


Просто из-за этого произошла ошибка ... они думали, когда делали этот метод :(
Леголас

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
Он хочет , чтобы сравнить DateTimeнеstring
Дань

Вы можете преобразовать дату и время в строку
Dieu Phan Dinh

или: вы можете использовать: DateTime.Compare (startDate, endDate)
Dieu Phan Dinh

Это не моя проблема и чем она отличается от проблемы Ахмета ?
Danh

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