After working fairly late last night I was too wound up to go to sleep when I got home.
Something possessed me to start creating a little
C# library
providing a fluent interface for working with
DateTimes,
DateTimeOffsets,
and TimeSpans
inspired by ActiveSupport's
active_support/core_ext/numeric/time and related extensions.
After about 3.Hours(30.Minutes()) the straightforward part had come together.
You can do stuff like this with it:
var toothBrushingTime = 10.Minutes().Before(bedTime);
var lightsOutForReal = 1.Hour(30.Minutes()).After(bedTime);
...
Assert.That(actual, Is.LessThan(50.Milliseconds().After(expected)));
These built in .NET types are pretty easy to work with and made the implementation very easy
(except for the bit where I discovered that
TimeSpan.FromMilliseconds
takes a double but only has whole-millisecond precision).
The one more complex thing I'd still like to add
is a variable-length variation on TimeSpan for handling units like months and years.
I'm interested to see how clean I can keep things when my type will only take
on a specific value based on the date-time value it's being added to or subtracted from.
That ought to be a good opportunity for exploring operator overloading.
(Unsurprisingly that hasn't come up in my day job just yet.)