I've written my own DI back in the days (way before Guice existed) but...
Using DI is just a glorified way to have "globals".
One better solution in TFA's example is to pass a high-order function whose "functionality" is to provide the time.
Wanna unit test? Pass in a modified function giving back the time you want.
That's just one way to do it.
DI is a fugly beast disguised as "good practice" but it really ain't. It complicates the code and is basically a hack allowing to more or less be able to test non-functional code. Really sad.
-- "Patterns means 'I've run out of language"