Risposte:
Ho creato una semplice struttura Date per le volte in cui hai bisogno di una data semplice senza preoccuparti della porzione di tempo, dei fusi orari, di local vs. utc, ecc.
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
Sfortunatamente, non in .Net BCL. Le date sono generalmente rappresentate come un oggetto DateTime con l'ora impostata su mezzanotte.
Come puoi immaginare, questo significa che hai tutti i problemi relativi al fuso orario intorno ad esso, anche se per un oggetto Date non vorresti assolutamente alcuna gestione del fuso orario.
dateper qualsiasi cosa è una cattiva idea a meno che tu non sia sicuro al 100% che la tua app funzionerà solo in un fuso orario. Salvare tutto come datetimeti dà il meglio di entrambi i mondi, incluso il più critico, un modo semplice per evitare incubi di fuso orario se le configurazioni del fuso orario del tuo server cambiano ... e inizia a scrivere dati in modi che non avevi previsto. Datetimepuò salvarti lì, datenon può affatto, e diventerà incredibilmente difficile da sistemare se inizi a scrivere datecon il contesto del fuso orario sbagliato.
Crea una classe wrapper. Qualcosa come questo:
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;
}
Ed esponi quello valueche vuoi.
DateTimeKind.Unspecifiedmodo che quando serializzato venga deserializzato senza convertire (potrebbe cambiare la data in base a diversi fusi orari).
DateTimeKind.Utc. Non impostarlo su DateTimeKind.Unspecifiedperché ciò garantirà che venga serializzato / deserializzato con un offset di fuso orario incluso! Una data del calendario è la stessa indipendentemente dal fuso orario, quindi non lasciare che il sistema la regoli.
Il tipo Date è solo un alias del tipo DateTime utilizzato da VB.NET (come int diventa Integer). Entrambi questi tipi hanno una proprietà Date che restituisce l'oggetto con la parte temporale impostata su 00:00:00.
L'oggetto DateTime ha una proprietà che restituisce solo la parte relativa alla data del valore.
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);
}
DateTimecon l'ora impostata su 0:00:00
Non esiste alcun DateDataType.
Tuttavia puoi usare DateTime.Dateper ottenere solo la data.
PER ESEMPIO
DateTime date = DateTime.Now.Date;
DateTime.Now.Dateè lo stesso di DateTime.Today. Esiste un DateTime.UtcNowche restituisce il valore data-ora come ora universale (UTC), ma non esiste un metodo o una proprietà equivalente a UTC per Today; DateTimeKind.UtcNow.Dateè l'espressione appropriata.
Puoi restituire DateTime dove la parte dell'ora è 00:00:00 e ignorarla. Le date vengono gestite come numeri interi di timestamp, quindi ha senso combinare la data con l'ora in quanto è comunque presente nell'intero.
Per questo, è necessario utilizzare la data, ma ignorare il valore dell'ora.
Normalmente una data sarebbe un DateTime con ora di 00:00:00
Il DateTimetipo ha una .Dateproprietà che restituisce il DateTimecon il valore temporale impostato come sopra.
public class AsOfdates
{
public string DisplayDate { get; set; }
private DateTime TheDate;
public DateTime DateValue
{
get
{
return TheDate.Date;
}
set
{
TheDate = value;
}
}
}
Puoi provare uno dei seguenti:
DateTime.Now.ToLongDateString();
DateTime.Now.ToShortDateString();
Ma non esiste un tipo "Data" nel BCL.