.NET Date без времени - есть ли, или мне не нужно? - PullRequest
36 голосов
/ 24 августа 2011

Я занимаюсь моделированием предметной области и сталкиваюсь со свойством, которое, на мой взгляд, лучше всего представить как Date, а не DateTime, без компонента времени.

Есть ли веская причина, почему в Framework нет такого типа?Считалось достаточно хорошей идеей добавить тип даты в SQL ServerКроме того, если кто-то знает о удобной реализации класса Date, пожалуйста, дайте мне знать!

2018 edit: я теперь решаю эту проблему, используя тип объекта Value:

public class Date : ValueOf<DateTime, Date>  //Install-Package ValueOf
{ 
    protected override void Validate() 
    { 
        if (Value.Date != Value) throw new ArgumentException(); 
    } 
}

...

var date = Date.From(someDateTime);

Ответы [ 7 ]

41 голосов
/ 24 августа 2011

Нет, его нет, и да, должно быть.

Я не верю, что есть иная причина, кроме того, что API даты и времени в .NET неочень хорошо на мой (очень предвзятый) взгляд.

Я работаю над новым API под названием Noda Time , который, конечно, имеет класс только для даты в (LocalDate), но он не готов кпроизводство еще.Конечно, он может уже делать все, что вам нужно, и если он почти делает, то вы всегда можете запросить только те функции, которые вам нужно реализовать раньше, чем позже ...

7 голосов
/ 30 января 2013

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

https://github.com/claycephas/csharp-date

6 голосов
/ 24 августа 2011

В хранилище базы данных важнее емкость, поэтому может иметь смысл тип date, который использует меньше места, чем datetime. В приложении вам редко требуется сохранять эти несколько байтов.

Вы могли бы довольно легко создать тип Date, который конвертирует в DateTime и обратно, но сохраняет только дни внутри. Что-то вроде:

public struct Date {

  private int _days;

  private Date(int days) { _days = days; }

  public implicit operator DateTime(Date date) {
    return DateTime.MinValue.AddDays(date._days);
  }

  public implicit operator Date(DateTime dateTime) {
    return new Date((int)(dateTime - DateTime.MinValue).TotalDays);
  }

}
0 голосов
/ 11 мая 2015

Используйте метод ToShortDateString ().Если вам нужно свойство для сетки или чего-то еще, создайте свойство только для чтения, которое просто возвращает yourDate.ToShortDateString (), и вы его получили!

0 голосов
/ 29 апреля 2013

Да, есть один. Date, DateTime (VB) и DateTime (C #) имеют функцию с именем Date, которая возвращает только часть даты даты / времени.

Существует также функция Time, так что вы можете использовать их для обеих частей и возвращать части даты / времени отдельно.

0 голосов
/ 28 января 2013

VB.NET имеет этот тип, Date тип данных. Я считаю, что это было здесь как требование для дедушкиного кода приложения VB6, который содержал этот тип, а не тип DateTime, который мы используем в .NET.

Дата Тип данных (Visual Basic):
http://msdn.microsoft.com/en-us/library/3eaydw6e(v=vs.110).aspx

0 голосов
/ 24 августа 2011

На самом деле в этом нет необходимости - просто используйте дату с компонентом времени, установленным в ноль (то есть полночь предыдущего дня), или просто полностью игнорируйте компонент времени.

Например, вы можете использовать DateTime.Today, чтобы получить сегодняшнюю дату (в отличие от DateTime.Now)

...