Відповіді:
Я створив просту структуру дат для тих часів, коли вам потрібна проста дата, не турбуючись про часовий проміжок часу, часові пояси, локальні та 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оскільки це гарантуватиме його серіалізацію / дезаріалізацію із включеним зміщенням часового поясу! Дата календаря однакова незалежно від часового поясу, тому не дозволяйте системі її коригувати.
Тип дати - це лише псевдонім типу 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щоб отримати просто Дату.
EG
DateTime date = DateTime.Now.Date;
DateTime.Now.Dateте саме, що DateTime.Today. Існує таке, DateTime.UtcNowщо повертає значення дати та часу як універсальний час (UTC), але немає методу чи властивості, еквівалентного 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 немає.