Ha, I was about to suggest the same.

Actually it has been bothering for a long time that "now" is defined by the
global system settings. I'd love if this could be made somehow injectable.
This would not only simplify testing but also help for use cases where
"now" depends on some external context, e.g. when re-running a batch job
from yesterday etc.

There could be a TimeProvider contract which is used by these validators to
obtain "now". By default we'd use the current behavior while we'd pass
another implementation for tests. In a next step, this contract could be
made pluggable for the user.