GPS time rollover compensation for broken devices
2020-12-22
Dennis Guse
Every 19.7 years aka every 1024 weeks the week counter in GPS transmission has an overflow.
This is how to apply a fix if the hardware did not got a software update.
/**
* 1. Ancient fix for phones that do not set the time in {@link android.location.Location}.
* 2. Fix for GPS time rollover happening every 19.7 years: https://en.wikipedia.org/wiki/GPS_Week_Number_Rollover
*/
public static void fixTime ( @NonNull Location trackPoint ) {
if ( trackPoint . getTime () == 0L ) {
Log . w ( TAG , "Time of provided location was 0. Using current time." );
trackPoint . setTime ( System . currentTimeMillis ());
return ;
}
{
long timeDiff = Math . abs ( trackPoint . getTime () - System . currentTimeMillis ());
if ( timeDiff > 1023 * UnitConversions . ONE_WEEK_MS ) {
Log . w ( TAG , "GPS week rollover." );
trackPoint . setTime ( trackPoint . getTime () + 1024 * UnitConversions . ONE_WEEK_MS );
}
}
}