Time.today() is documented as "Use today() to get a Moment for the beginning of today based on your current GPS location."
I do not believe it behaves in this manner. Were it based on your GPS location, it would roll over when you see a new day, however it rolls over when UTC sees a new day, so is out of sync with current GPS location.
I think this function should roll over when (UTC + TZO) % 86400 == 0.