Per prima cosa riconosci che quando dici "oggi", la risposta potrebbe essere diversa per persone diverse in diverse parti del mondo. Pertanto, al fine di ottenere la data locale corrente, è necessario avere un fuso orario in mente.
Noda Time modella correttamente questo dandoti un Instant
quando si chiama Now
da un'implementazione IClock
come l'orologio di sistema. Un istante è universale, quindi è sufficiente convertirlo in un certo fuso orario per ottenere la data locale di quel fuso orario.
// get the current time from the system clock
Instant now = SystemClock.Instance.Now;
// get a time zone
DateTimeZone tz = DateTimeZoneProviders.Tzdb["Asia/Tokyo"];
// use now and tz to get "today"
LocalDate today = now.InZone(tz).Date;
Questo è il codice minimo. Naturalmente, se si desidera utilizzare il fuso orario locale del computer (come avete fatto con DateTime.Now
), è possibile ottenere in questo modo:
DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
E per davvero implementare in modo corretto, è necessario chiamare .Now
dall'interfaccia IClock
, in modo tale da poter sostituire l'orologio di sistema con un falso orologio per i test dell'unità.
Questo è un ottimo esempio di come Noda Time intenzionalmente non nasconda le cose da voi. Tutto questo è ancora in corso sotto il cofano quando chiami DateTime.Now
, ma semplicemente non lo vedi. You can read more about Noda Time's design philosophy in the user guide.
fonte
2015-01-09 04:30:22
Mi piace. 2.0 sembra sempre meglio! –