What is the recommended way to create a LocalDate instance that represents "today". I was expecting there to be a static "Now" or "Today" property in the LocalDate class, but there isn't. My current approach is to use DateTime.Now:
var now = DateTime.Now;
LocalDate today = new LocalDate(now.Year, now.Month, now.Day);
Is there a better way?
First recognize that when you say "today", the answer could be different for different people in different parts of the world. Therefore, in order to get the current local date, you must have a time zone in mind.
Noda Time correctly models this by giving you an
Instant
when you callNow
from anIClock
implementation such as the system clock. An instant is universal, so you just need to convert it to some time zone to get that time zone's local date.That's the minimal code. Of course, if you want to use the computer's local time zone (like you did with
DateTime.Now
), you can get it like so:And to really implement it properly, you should call
.Now
from theIClock
interface, such that you could substitute the system clock with a fake clock for your unit tests.This is a great example of how Noda Time intentionally doesn't hide things from you. All this is still going on under the hood when you call
DateTime.Now
, but you just don't see it. You can read more about Noda Time's design philosophy in the user guide.Jon's answer is right, but I think it is helpful to put it all together. For NodaTime 2.x:
Matt's answer is spot on for Noda Time 1.x.
In Noda Time 2.0, I'm introducing a
ZonedClock
, which is basically a combination ofIClock
and aDateTimeZone
. As you're likely to want the current time in the same time zone multiple times, you can inject that (I'm assuming you're using dependency injection) and retain that, then use it. For example:You would normally provide the
ZonedClock
by taking anIClock
and using one of the new extension methods, e.g.Note that your 1.x code won't work in 2.x anyway - I'm removing the
Now
property fromIClock
as it really shouldn't be a property (given the way it changes) - it's now aGetCurrentInstant()
method.;