Дата против DateTime

110

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

Я ищу, а Dateне а DateTime.

Есть ли тип данных, который возвращает только дату?

MrM
источник

Ответы:

131

Нет, нет. DateTimeпредставляет некоторый момент времени, состоящий из даты и времени. Однако вы можете получить часть даты с помощью Dateсвойства (которое является другим DateTimeс установленным временем 00:00:00).

И вы можете получить отдельные свойства даты с помощью Day, Monthи Year.

Рональд Вильденберг
источник
23

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

Date today = Date.Today;
Date yesterday = Date.Today.AddDays(-1);
Date independenceDay = Date.Parse("2013-07-04");

independenceDay.ToLongString();    // "Thursday, July 4, 2013"
independenceDay.ToShortString();   // "7/4/2013"
independenceDay.ToString();        // "7/4/2013"
independenceDay.ToString("s");     // "2013-07-04"
int july = independenceDay.Month;  // 7

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

Глина
источник
2
Спасибо! Это полезно.
garfbradaz
16

К сожалению, не в .Net BCL. Даты обычно представлены как объект DateTime со временем, установленным на полночь.

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

Джонатан Рупп
источник
1
Если вы используете значение DateTime в качестве даты, установите для Kind значение UTC. Никаких корректировок часового пояса. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000 02
Да, я могу сказать по собственному опыту, что использование dateдля чего-либо - плохая идея, если вы не уверены на 100%, что ваше приложение будет работать только в одном часовом поясе. Сохранение всего как datetimeдает вам лучшее из обоих миров, в том числе, что наиболее важно, простой способ избежать кошмаров часового пояса, если конфигурация часового пояса вашего сервера когда-либо изменится ... и начинает записывать данные способами, которых вы не ожидали. Datetimeможет спасти вас там, dateне может вообще, и станет невероятно сложно исправить, если вы когда-нибудь начнете dateзаписывать с неправильным контекстом часового пояса.
Келси Ханнан
2
@KelseyHannan, если, конечно, вы не имеете дело с такими вещами, как «дата рождения» или «дата покупки», когда вы явно не хотите, чтобы что-то загадочно меняло дни только потому, что вы переехали в другую страну. Например, обработка ирландских ипотечных заявок в Новой Зеландии в качестве неслучайного примера.
Роджер Уиллкокс
9

Создайте класс-оболочку. Что-то вроде этого:

public class Date:IEquatable<Date>,IEquatable<DateTime>
    {
        public Date(DateTime date)
        {
            value = date.Date;
        }

        public bool Equals(Date other)
        {
            return other != null && value.Equals(other.value);
        }

        public bool Equals(DateTime other)
        {
            return value.Equals(other);
        }

        public override string ToString()
        {
            return value.ToString();
        }
        public static implicit operator DateTime(Date date)
        {
            return date.value;
        }
        public static explicit operator Date(DateTime dateTime)
        {
            return new Date(dateTime);
        }

        private DateTime value;
    }

И выставляйте все, valueчто хотите.

Эйвинд Скаар
источник
4
Я хотел бы предложить , что ваш конструктор должен установить DateTime.Kind к DateTimeKind.Unspecifiedтак что , когда он получает сериализовать десериализации без преобразования (дата может меняться в зависимости от различных в часовых поясах).
oatsoda
1
@OffHeGoes Установите для DateTime.Kind значение DateTimeKind.Utc. Не устанавливайте его, DateTimeKind.Unspecifiedпотому что это гарантирует сериализацию / десериализацию с включенным смещением часового пояса! Календарная дата одинакова независимо от часового пояса, поэтому не позволяйте системе настраивать ее.
Suncat2000 02
5

Тип Date - это просто псевдоним типа DateTime, используемого VB.NET (например, int становится Integer). Оба эти типа имеют свойство Date, которое возвращает объект с временной частью, установленной на 00:00:00.

Стивипвелл
источник
1
Правда. На странице документации MSDN для типа VB.NET Date говорится: Соответствующим типом в .NET Framework является структура System.DateTime .
miroxlav 05
4

DateTime имеет свойство Date, которое можно использовать для изоляции части даты. Метод ToString также хорошо справляется с отображением только части даты, когда часть времени пуста.

Пересекать
источник
3

Объект DateTime имеет свойство, которое возвращает только часть значения даты.

    public static void Main()
{
    System.DateTime _Now = DateAndTime.Now;
    Console.WriteLine("The Date and Time is " + _Now);
    //will return the date and time
    Console.WriteLine("The Date Only is " + _Now.Date);
    //will return only the date
    Console.Write("Press any key to continue . . . ");
    Console.ReadKey(true);
}
hmcclungiii
источник
Это неверный ответ. Date возвращает DateTimeзначение 0:00:00
Серж Саган,
3

Нет DateDataType.

Однако вы можете использовать DateTime.Dateтолько дату.

НАПРИМЕР

DateTime date = DateTime.Now.Date;
Ник Н.
источник
Существует структура Date, и объекты могут быть объявлены как тип Date.
Калеб Андерсон
@KalebAnderson не входит в стандартную реализацию .NET, нет. Если вы говорите о дате VB.net, это все равно DateTime.
Ник Н.
DateTime.Now.Dateтакое же, как DateTime.Today. Существует объект, DateTime.UtcNowкоторый возвращает значение даты и времени в формате всемирного времени (UTC), но для Today не существует метода или свойства, эквивалентного UTC; DateTimeKind.UtcNow.Dateподходящее выражение.
Suncat2000 02
2

Вы можете вернуть DateTime, где время составляет 00:00:00, и просто проигнорировать его. Даты обрабатываются как целые числа отметки времени, поэтому имеет смысл комбинировать дату со временем, поскольку оно в любом случае присутствует в целом числе.

Микко Рантанен
источник
2

Для этого вам нужно использовать дату, но игнорировать значение времени.

Обычно датой является DateTime со временем 00:00:00

DateTimeТип имеет .Dateсвойство , которое возвращает DateTimeс установленным значением времени , как указано выше.

Сэм Мелдрам
источник
1
public class AsOfdates
{
    public string DisplayDate { get; set; }
    private DateTime TheDate;
    public DateTime DateValue 
    {
        get 
        { 
            return TheDate.Date; 
        } 

        set 
        { 
            TheDate = value; 
        } 
    }    
}
Уильям Мендоза
источник
4
Было бы полезно дать пояснения к вашему ответу.
Гуаньси
0

Вы можете попробовать одно из следующего:

DateTime.Now.ToLongDateString();
DateTime.Now.ToShortDateString();

Но в BCL нет типа «Дата».

Эндрю Хэйр
источник