Ping refers to round-trip latency, and this is one of the big reasons. For something as small and precise as ping, the two clocks are never going to be synchronized well enough even if they were in the same timezone.
Use a RemoteFunction instead, fired from the client:
local start = tick()
remoteFunction:InvokeServer()
local ping = tick()-start
Reply from the server:
remoteFunction.OnServerInvoke = function() return true end
Or you can switch the client and server if you wanted the ping to be visible to everyone or readable on the server.