Zainteresowało mnie to i pogrzebałem dalej. Linuksy korzystają zazwyczaj z danych zebranych w bazie Olsona [1], nie wiem z czego korzysta Windows. Z tym, że JRE od wersji 1.3.1 również zawiera tę bazę i nie odwołuje się do OS ("The Java SE platform's timezone data is not read from the local or host operating system" [2]).
Pewnym rozwiązaniem mogłoby być wymuszenie stosowania tej samej strefy czasowej na serwerze i u klienta, np. tak
TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
TimeZone.setDefault(tz);
z tym, że to już zależy od konkretnego zastosowania (jeśli klient będzie znajdował się poza naszą strefą to pewnie nie będzie zadowolony z tego, że otrzymuje datę dla Polski).
Można by też spróbować stosować zawsze datę w UTC, lub użyć innej biblioteki, np. Joda Time [3].
[1] http://www.twinsun.com/tz/tz-link.htm
[2] http://java.sun.com/javase/timezones/
[3] http://joda-time.sourceforge.net/index.html