Избегайте j.u.Calendar
Классы java.util.Date и .Calendar, как известно, хлопотное и устаревшее. Избежать их. Вместо этого используйте Joda-Time или пакет java.time в Java 8 (вдохновленный Joda-Time).
В отличие от j.u.Date, объект даты в этих двух других библиотеках знает свой собственный назначенный часовой пояс.
Joda времени
Некоторые примеры кода в Joda-Time 2.5. Работа с часовыми поясами становится элементарной при использовании Joda-Time.
DateTime dateTimeDefaultZone = DateTime.now(); // The JVM’s current default time zone assigned. I recommend always specifying a zone instead of implicitly relying on default.
DateTime dateTimeLosAngeles = dateTimeDefaultZone.withZone(DateTimeZone.forID("America/Los_Angeles"));
DateTime dateatimeUtc = dateTimeDefaultZone.withZone(DateTimeZone.UTC);
DateTime dateTimeKolkata = dateTimeDefaultZone.withZone(DateTimeZone.forID("Asia/Kolkata"));
Time Zone Имена
Используйте proper time zone names. Избегайте этих 3 или 4 буквенных кодов, поскольку они не являются стандартизованными и не уникальными, и они путают проблему летнего времени.
Чтобы изменить значение 'java.util.Date.getTime()' to * local * millis действительно очень плохая идея дизайна. Вы кодируете в противоположность спецификации, игнорируя спецификацию этого класса. Это просто грязный хак. –