Как сделать, чтобы не менялось время в Date при смене часового пояса?
Ситуация: в моем приложении два фрагмента. В первом фрагменте пользователь выбирает дату, которая записывается в переменную типа Date. Далее, пользователь меняет в настройках телефона часовой пояс, нажимает на кнопку. Записанная дата передается во второй фрагмент и выводится там в TextView.
Проблема: Даты на первом и втором фрагментах не совпадают. То есть если стоял у пользователя часовой пояс -11 при выборе даты и +13 при просмотре второго фрагмента, а на первом фрагменте он выбрал 1 июня, то на втором фрагменте он увидит 2 июня.
Как сделать так, чтобы дата не менялась? Из-за чего так происходит?
Date хранит момент во времени. Проблема в том , что в один и тот же момент в разных часовых поясах на часах разное время а на календаре разная дата. Между -11 и +13 ровно 24 часа, поэтому любое время будет иметь разную дату между этими поясами.
Как сделать так, чтобы дата не менялась?
Используйте Calendar (GregorianCalendar) или SimpleDateFormat: что нибудь, что сохраняет информацию от таймзоне.
А есть ли возможность как-то просто повлиять на текущий объект Date без перевода на другой тип хранения даты? Сконвертировать или что-то такое, с учетом ситуации.
Артем: DateFormat. Ей можно принудительно скормить нужный часовой пояс чтобы дата выводилась вне зависимости от текущего часового пояса.
К примеру можно выводить всё в UTC, а чтобы не менялась дата из-за перевода в UTC сразу после создания добавлять разницу между UTC и текущей зоной к таймстампу.
Создание:
Создаёте «оригинальный» Date. Создаёте TimeZone соответствующую текущей таймзоне. Складываете результат Date.getTime() и TimeZone.getRawOffset(), конструируете «изменённый» Date.
Вывод:
Создаёте SimpleDateFormat и устанавливаете ему часовой пояс UTC при помощи setTimeZone. Используете этот SimpleDateFormat чтобы перевести изменённый Date в строку.
Хотя я очень советую не использовать Date для этого. Или сохраняйте часовой пояс где была создана Date вместе с ней.
Кстати, вы можете сказать, какого числа вы задали этот вопрос?
Артем: А вот и не угадали, 21 мая в 01:11. Привет из Норильска.
Вот поэтому и необходимо сохранять информацию о часовом поясе и понимать зачем нужны разные классы для работы со временем.
Со временем вообще непросто работать и необходимо очень чётко ставить задачу: «заставить будильник сработать за 15 минут до видеосвязи с заказчиком» должно учитывать смену часовых поясов и изменять местное время сигнала, а «проснуться в 9:00 по местному времени» — нет