The logic in the
Date class is strange and somewhat backwards. Multiple methods have documentation that contradict the actual methods, and sometimes the actual logic just doesn't make sense.
Date::factory('today', $timezone)takes a timezone, but does not return 'today in $timezone`, it returns 'the time in $timezone that is 'today' in UTC'. then it discards the timezone and treats the result as UTC.
Date::$timestampis supposed to store the time in UTC, but in
getTimestamp()it is treated as a time in another timezone.
getTimestamp() != getTimestampUTC()even though both say they return UTC time.
The API should be audited, trimmed and made coherent, but only for Matomo 4 since so much depends on this code.
Things that should be done:
getDatetime($timezone = 'UTC'),
toString($timezone = 'UTC'),
Date::factory($value, $timezone = 'UTC')
Date::factory(...)should not accept timestamps (or should throw a if a timezone is specified w/ the timestamp). the semantics of
Date::factory()should be, give me the posix timestamp of this date in this timezone. (ie, give me the UTC timestamp of
2012-03-04 03:05:23 UTC+5.
Should also probably make sure the mysql session uses UTC instead of any other configured timezone.