At OpenSignal, each datapoint we collect has two timestamps: the time the reading was taken and the time the reading was inserted to our server. Because we make extensive use of SQLite cacheing on devices, these times can be far apart – sometimes up to the order of weeks. The app reading time, however, should always be before the server insert time, otherwise you have an apparent violation of causality. When we noticed this happening occasionally, we took a closer look and found widespread difficulties getting accurate time readings.
We found ~3.5% of clocks are out by one hour or more, with 1.9% of clocks being fast.
We uncovered various causes of time discrepancies on Android: a bug in Android’s setting of time via GPS which produces a 15s error; disagreements of one hour caused by Time Zone edge cases and perhaps also by a system bug in the application of timezones; and deliberate, manual mis-setting of the system time to fool games.
The details are gory, if you like graphs and want to know how to fix it, check out the full report.