2009-04-28 4 views
74

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

ответ

93

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

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

1

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

12

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

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

+0

Если вы используете значение DateTime в качестве даты, установите Kind в формате UTC. Никаких корректировок часовых поясов. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc); – Suncat2000

+0

Да, я могу говорить по опыту, что использование «даты» для чего-то плохое, если вы на 100% не уверены, что ваше приложение будет работать только в одном часовом поясе. Сохранение всего, поскольку 'datetime' дает вам лучшее из обоих миров, в том числе наиболее критически, простой способ избежать кошмаров часовых поясов, если настройки вашего часового пояса вашего сервера когда-либо меняются ... и начинает писать данные так, как вы этого не ожидали. 'Datetime' может спасти вас там,' date' вообще не может и будет очень трудно исправить, если вы когда-нибудь начнете писать «date» с неправильным контекстом часового пояса. – Kelseydh

0

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

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

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

4

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

+1

Правда. [Страница документа MSDN для типа даты VB.NET] (http://msdn.microsoft.com/en-us/library/3eaydw6e.aspx): * Соответствующий тип в .NET Framework - это [System.DateTime] (http://msdn.microsoft.com/en-us/library/system.datetime.aspx). * – miroxlav

3

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

1

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

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

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

1

Объект 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); 
} 
+0

Этот ответ неверен. Дата возвращает 'DateTime' с временем, установленным в 0:00:00 –

7

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

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 вы хотите.

+0

Неявные и явные неверны? – Behrooz

+3

Я бы предположил, что ваш конструктор должен установить [DateTime.Kind] (http://msdn.microsoft.com/en-us/library/system.datetime.kind (v = vs.110) .aspx) на ' DateTimeKind.Unspecified', так что при сериализации он десериализуется без преобразования (может изменить дату, основанную на разных часовых поясах). – OffHeGoes

+1

@OffHeGoes Установите DateTime.Kind в 'DateTimeKind.Utc'. * Не устанавливайте его в 'DateTimeKind.Unspecified', потому что это гарантирует, что он будет сериализован/десериализован с включенным смещением часового пояса! Календарная дата одинакова независимо от часового пояса, поэтому не позволяйте системе ее корректировать. – Suncat2000

16

Я создал простой Date struct для тех случаев, когда вам нужна простая дата, не беспокоясь о временной части, часовых поясах, локальных против 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

1

Там нет Date DataType.

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

E.G.

DateTime date = DateTime.Now.Date; 
+0

Существует структура Date, и объекты могут быть объявлены как тип Date. –

+0

@KalebAnderson не в реализации по умолчанию .NET, нет. Если вы говорите о дате VB.net, это все равно DateTime. –

+0

'DateTime.Now.Date' совпадает с' DateTime.Today'. Существует 'DateTime.UtcNow', который возвращает значение даты-времени как универсальное время (UTC), но для Today нет эквивалентного метода или свойства UTC; 'DateTimeKind.UtcNow.Date' является подходящим выражением. – Suncat2000

1
public class AsOfdates 
{ 
    public string DisplayDate { get; set; } 
    private DateTime TheDate; 
    public DateTime DateValue 
    { 
     get 
     { 
      return TheDate.Date; 
     } 

     set 
     { 
      TheDate = value; 
     } 
    }  
} 
+4

Внесение некоторых объяснений в ваш ответ было бы полезно. – Guanxi

Смежные вопросы