Well, I know they're anchored to UTC, but where do they get the UTC time from? An official time server? Or the block-creator's local system time?
I think what happens is your client asks all the other clients it talks to what they think the time is, and keeps a list of the offsets between them and what it thinks the time is. It then uses the middle of that list as the real time.
For example, in .bitcoin/debug.log I see:
Added time data, samples 59, offset +8 (+0 minutes)
-31539317 -156 -148 -115 -99 -89 -80 -77 -30 -29 -28 -22 -21 -19 -18 -16 -16 -12 -12 -11 -11 -9 -8 -7 -7 -6 -6 -5 -4 -2 -2 -1 -1 -1 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +2 +2 +3 +3 +3 +4 +5 +6 +8 +8 +9 +15 +31 +245 | nTimeOffset = -2 (+0 minutes)
The client has got 59 different times from peers and those are the offsets from my clock in seconds.
5 of them agreed with my client to the nearest second. Most clients agreed to within a minute. A few were out by 2 to 5 minutes, and one guy doesn't know what year it is (365*24*60*60 = 31536000). The middle of that list of 59 time offsets is -2, and so 2 seconds is added (or subtracted?) from my computer clock to get the 'real' time.