Ответы:
Я создал простую структуру 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
К сожалению, не в .Net BCL. Даты обычно представлены как объект DateTime со временем, установленным на полночь.
Как вы можете догадаться, это означает, что у вас есть все сопутствующие проблемы с часовыми поясами, хотя для объекта Date вам не нужно абсолютно никакой обработки часового пояса.
dateдля чего-либо - плохая идея, если вы не уверены на 100%, что ваше приложение будет работать только в одном часовом поясе. Сохранение всего как datetimeдает вам лучшее из обоих миров, в том числе, что наиболее важно, простой способ избежать кошмаров часового пояса, если конфигурация часового пояса вашего сервера когда-либо изменится ... и начинает записывать данные способами, которых вы не ожидали. Datetimeможет спасти вас там, dateне может вообще, и станет невероятно сложно исправить, если вы когда-нибудь начнете dateзаписывать с неправильным контекстом часового пояса.
Создайте класс-оболочку. Что-то вроде этого:
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что хотите.
DateTimeKind.Unspecifiedтак что , когда он получает сериализовать десериализации без преобразования (дата может меняться в зависимости от различных в часовых поясах).
DateTimeKind.Utc. Не устанавливайте его, DateTimeKind.Unspecifiedпотому что это гарантирует сериализацию / десериализацию с включенным смещением часового пояса! Календарная дата одинакова независимо от часового пояса, поэтому не позволяйте системе настраивать ее.
Тип Date - это просто псевдоним типа DateTime, используемого VB.NET (например, int становится Integer). Оба эти типа имеют свойство Date, которое возвращает объект с временной частью, установленной на 00:00:00.
Объект 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);
}
DateTimeзначение 0:00:00
Нет DateDataType.
Однако вы можете использовать DateTime.Dateтолько дату.
НАПРИМЕР
DateTime date = DateTime.Now.Date;
DateTime.Now.Dateтакое же, как DateTime.Today. Существует объект, DateTime.UtcNowкоторый возвращает значение даты и времени в формате всемирного времени (UTC), но для Today не существует метода или свойства, эквивалентного UTC; DateTimeKind.UtcNow.Dateподходящее выражение.
Вы можете вернуть DateTime, где время составляет 00:00:00, и просто проигнорировать его. Даты обрабатываются как целые числа отметки времени, поэтому имеет смысл комбинировать дату со временем, поскольку оно в любом случае присутствует в целом числе.
Для этого вам нужно использовать дату, но игнорировать значение времени.
Обычно датой является DateTime со временем 00:00:00
DateTimeТип имеет .Dateсвойство , которое возвращает DateTimeс установленным значением времени , как указано выше.
public class AsOfdates
{
public string DisplayDate { get; set; }
private DateTime TheDate;
public DateTime DateValue
{
get
{
return TheDate.Date;
}
set
{
TheDate = value;
}
}
}
Вы можете попробовать одно из следующего:
DateTime.Now.ToLongDateString();
DateTime.Now.ToShortDateString();
Но в BCL нет типа «Дата».