Good question. Your concern is valid, and the current implementation has a slightly different answer from the one you presumed.
Objo’s DateTime deliberately does not retain .NET’s DateTimeKind. It is a timezone-naive wall-clock value, so a value obtained from either DateTime.Now or DateTime.UtcNow has no stored Local/UTC kind afterwards.
However, Objo does preserve the complete .NET tick count, including ticks below one millisecond. DateTime.Now, parsing and host APIs such as files and databases can therefore introduce sub-millisecond precision. Add, Subtract, equality, ordering and hashing all use that complete value.
That means two DateTimes can display the same millisecond while still comparing unequal. It isn’t really arithmetic drift (the original fractional value is being preserved) but the precision was insufficiently visible through the API.
I’ve made this explicit and controllable for the next release:
DateTime.Ticks returns the exact number of 100-nanosecond ticks.
DateTime.FromTicks(ticks) reconstructs an exact value.
date.TruncateToMilliseconds() returns a value with any sub-millisecond ticks discarded.
I decided not to discard those ticks automatically because Duration also has 100-nanosecond precision and DateTime.Add(Duration) and Subtract should remain exact. Callers wanting millisecond-resolution identity can now request it explicitly:
Var precise As DateTime = DateTime.Now
Var milliseconds As DateTime = precise.TruncateToMilliseconds()
Incidentally, the current Duration API exposes its exact value through Duration.Ticks and can construct one with Duration.FromTicks().
The change is tracked here: Make DateTime tick precision explicit and controllable and will be in the next release.