I would highly suspect Ubuntu and Windows disagreeing on whether the hwclock is localtime or UTC. The conflict usually comes about because Linux uses the the hwclock set in UTC, while Windows uses the hwclock set to the localtime zone.
If you want your hwclock to show the time in your timezone, then you will need to change linux to not be UTC, which means make linux use localtime. If you are OK with your hwclock (BIOS) to be in UTC, then change windows to be UTC.
Make Windows use UTC
Note: This method was not initially supported on Windows Vista and Server 2008, but came back with Vista SP2, Windows 7, Server 2008 R2 and Windows 8/8.1.
To make MS Windows calculate the time from the hardware clock as UTC.
Create a file named WindowsTimeFixUTC.reg
with the following contents and then double click on it to merge the contents with the registry:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]
"RealTimeIsUniversal"=dword:00000001
Note: Windows Time service will still write local time to the RTC regardless of the registry setting above on shutdown, so it is handy to disable Windows Time service with this command (if time sync is still required while in Windows use any third-party time sync solution):
sc config w32time start= disabled
Reversing the change.
You can create a file with the following contents and then double-click it to merge in the original changes, as above:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]
"RealTimeIsUniversal"=-
If Windows Time service was disabled, enable it again with the command:
sc config w32time start= demand
Make Linux use 'Local' time
To tell your Ubuntu system that the hardware clock is set to 'local' time:
Pre-Ubuntu 15.04 systems (e.g. Ubuntu 14.04 LTS):
edit /etc/default/rcS and add or change the following section
#Set UTC=yes if your hardware clock is set to UTC (GMT)
UTC=no
Ubuntu 15.04 systems and above (e.g. Ubuntu 16.04 LTS):
open a terminal and execute the following command:
timedatectl set-local-rtc 1
Best Answer
GPS time isn't the same as UTC, it's just very close.
GPS is a very accurate source as far as time differences go, but as it doesn't take into account leap seconds it hasn't actually been in sync with UTC since January 1980. However it's only about 15 seconds ahead, so that doesn't account for your 2 minute difference.
If your other time sources are based on the international atomic clock standard (TAI, Temps Atomique International), then they're also not set to UTC, not because they're inaccurate, but more because UTC is inaccurate in comparison. They don't take into account leap seconds, and their time is based on ticks of the SI standard 'second' rather than being based on the rotation/orbit of the Earth as UTC is. They're about 34 seconds ahead of UTC. Still doesn't account for your difference.
See here http://leapsecond.com/java/gpsclock.htm or here http://en.wikipedia.org/wiki/Global_Positioning_System#Timekeeping for more info.