Odpowiedzi:
Stworzyłem prostą strukturę Date dla czasów, kiedy potrzebujesz prostej daty bez martwienia się o część czasową, strefy czasowe, lokalną i utc itp.
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
Niestety nie w .Net BCL. Daty są zwykle reprezentowane jako obiekt DateTime z czasem ustawionym na północ.
Jak możesz się domyślić, oznacza to, że masz wszystkie związane z nią problemy ze strefą czasową, nawet jeśli w przypadku obiektu Date nie chcesz absolutnie żadnej obsługi strefy czasowej.
datedo czegokolwiek to zły pomysł, chyba że masz 100% pewności, że Twoja aplikacja będzie działać tylko w jednej strefie czasowej. Zapisanie wszystkiego, co datetimedaje ci to, co najlepsze z obu światów, w tym co najważniejsze, łatwy sposób na uniknięcie koszmarów związanych ze strefą czasową, jeśli konfiguracja strefy czasowej twojego serwera kiedykolwiek się zmieni ... i zacznie zapisywać dane w sposób, którego się nie spodziewałeś. Datetimemoże cię tam uratować, datew ogóle nie może, i stanie się niezwykle trudna do naprawienia, jeśli kiedykolwiek zaczniesz pisać datew złym kontekście strefy czasowej.
Utwórz klasę opakowania. Coś takiego:
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;
}
I ujawniaj, co valuechcesz.
DateTimeKind.Unspecifiedtak, aby po serializacji został zdeserializowany bez konwersji (może zmienić datę na podstawie różnych stref czasowych).
DateTimeKind.Utc. Nie ustawiaj go na, DateTimeKind.Unspecifiedponieważ zagwarantuje to, że zostanie serializowany / deserializowany z dołączonym przesunięciem strefy czasowej! Data w kalendarzu jest taka sama niezależnie od strefy czasowej, więc nie pozwól, aby system ją dostosował.
Typ Date to po prostu alias typu DateTime używanego przez VB.NET (podobnie jak int zmienia się w Integer). Oba te typy mają właściwość Date, która zwraca obiekt z częścią czasu ustawioną na 00:00:00.
Obiekt DateTime ma Właściwość, która zwraca tylko część wartości związaną z datą.
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);
}
DateTimez czasem ustawionym na 0:00:00
Nie ma DateDataType.
Możesz jednak użyć DateTime.Datetylko daty.
NA PRZYKŁAD
DateTime date = DateTime.Now.Date;
DateTime.Now.Datejest taki sam jak DateTime.Today. Istnieje DateTime.UtcNowfunkcja, która zwraca wartość daty i godziny jako czas uniwersalny (UTC), ale nie ma równoważnej metody ani właściwości UTC dla Dzisiaj; DateTimeKind.UtcNow.Datejest odpowiednim wyrażeniem.
Możesz zwrócić DateTime, gdzie część czasu to 00:00:00 i po prostu ją zignorować. Daty są traktowane jako liczby całkowite ze znacznikiem czasu, więc sensowne jest łączenie daty z godziną, która i tak występuje w liczbie całkowitej.
W tym celu musisz użyć daty, ale zignoruj wartość czasu.
Zwykle data byłaby DateTime z czasem 00:00:00
DateTimeTypu ma .Datewłaściwość, która zwraca DateTimesię z zestawu wartości czasu jak wyżej.
public class AsOfdates
{
public string DisplayDate { get; set; }
private DateTime TheDate;
public DateTime DateValue
{
get
{
return TheDate.Date;
}
set
{
TheDate = value;
}
}
}
Możesz spróbować jednego z poniższych:
DateTime.Now.ToLongDateString();
DateTime.Now.ToShortDateString();
Ale w BCL nie ma typu „Data”.