Вопрос по android, timezone – Разница часовых поясов Android на 1 час меньше, чем ожидалось

2

Что мне нужно, это разница во времени между конкретным часовым поясом («Россия / Москва») и местным временем пользователя, разница должна быть в часах.

Я сталкиваюсь с проблемой, что разница часовых поясов иногда неверно рассчитывается. Я рассчитываю разницу (в часах) между локальным смещением по UTC устройства Android и удаленным смещением по UTC. Для большинства пользователей это нормально .. но многие пользователи жалуются на проблему .. Я не могу воспроизвести ее на своем телефоне или эмуляторах. «Неправильная» отображаемая разница во времени всего на 1 час меньше. В Москве это 15:00, в Европе 12:00. Но пользователь видит смещение в 2 часа, вот мой код.

 String tz="Europe/Moscow"
 Calendar mCalendar = new GregorianCalendar();
 mCalendar.setTimeZone( TimeZone.getTimeZone(tz));
 TimeZone mTimeZone = mCalendar.getTimeZone();  
 int remote = mTimeZone.getRawOffset()/1000/60/60;

 Calendar mCalendar2 = new GregorianCalendar();
 TimeZone mTimeZone2 = mCalendar2.getTimeZone();  
 int local = mTimeZone2.getRawOffset()/1000/60/60;

 return local - remote;
В настоящее время Москва опережает Лондон на 4 часа, хотя летом она будет на 3 часа вперед, так как в Великобритании время на часах вперед. Другие страны будут делать то же самое. Вы принимаете это во внимание? Есть ли какая-то закономерность между пользователями, которые жалуются, и теми, кто нет? Посмотрите на время в этих странах, и поменяют ли они свои часы. user146043
Ваши часы идут вперед / назад два раза в год из-за "Летнего времени" / "Летнего времени"? Посмотрите на числа, которые вы получите, прежде чем делать вычитание. user146043
Я не знаю .. потому что это не происходит со мной. По моему телефону все ок. это сообщения об ошибках от пользователя .. :( user1908375

Ваш Ответ

1   ответ
4

Часовой пояс сСмещение часового пояса, Это две разные вещи. Пожалуйста, прочитайтетэг часового пояса вики.

Когда вы звонитеgetRawOffset, который возвращаетстандарт смещение для этого часового пояса. Чтобы получить смещение, действующее в определенный момент времени, вы можете использоватьgetOffset, который принимает параметр метки времени для момента времени, о котором вы говорите.

Рассмотрим следующий код, который возвращает разницуВ настоящее время в результате:

long now = System.currentTimeMillis();

String tz = "Europe/Moscow";
TimeZone mTimeZone = TimeZone.getTimeZone(tz);  
int remote = mTimeZone.getOffset(now);

TimeZone mTimeZone2 = TimeZone.getDefault();  
int local = mTimeZone2.getOffset(now);

double differenceInHours = (local - remote) / 3600000.0;

return differenceInHours;

Обратите внимание на пару вещей:

Мне не нужноCalendar учебный класс.Смещения оба для одного и того же «сейчас». Вы получите разные результаты в зависимости от того, когда вы запустите его.Не все смещения используют целое количество часов, поэтому эта функция должна возвращатьdoubleнеint, Например, попробуйтеAsia/Kolkata, который использует UTC + 5: 30 весь год, илиAustralia/Adelaide, который чередуется между UTC + 9:30 и UTC + 10:30.

Рассмотрите также использованиеJoda времени, который является гораздо более надежным способом работы со временем в Java.

Похожие вопросы