Android Date Timezones сводит меня с ума - PullRequest
4 голосов
/ 05 декабря 2010

У меня есть приложение для Android, которое работает с модулем GPS и базой данных SQLite. Вначале все звучит так хорошо, но ужас приходит, когда мне нужно работать с датой () и часовыми поясами.

Небольшой фон

Модуль GPS имеет возможность получать дату со спутника. Это отличная вещь, и она мне нужна в моем приложении, чтобы обеспечить достоверность данных. Дата, возвращаемая из него - время по Гринвичу. Эта дата вставляется в поле в локальной базе данных как StartTime. StartTime хранится в зашифрованном виде с AES. Когда я расшифровываю StartTime, мне нужно преобразовать его как дату и сохранить формат как GMT.

Что я делаю Получить данные с GPS в LocationListener:

gpsDate = new Date(location.getTime());

при наличии новой даты () по умолчанию дата GPS преобразуется в текущий часовой пояс устройства. Таким образом, вместо хорошего Вс 5 декабря 14:00:00 по Гринвичу 2010 времени, я получаю Вс 5 декабря 16:00:00 по Гринвичу + 2 2010 . Почему это так? Я просто хотел новую дату из getTime ().

Вставляю данные в базу данных:

SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
outputFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 
String date = outputFormat.format(gpsDate);

Я получаю дату, когда мне это нужно:

SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
outputFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
String myStored = {decrypy from the database}
Date myStartDate = outputFormat.parse(myStoredDate);

myStored показывает: 2010-12-05 14: 00

myStartDate показывает: вс декабрь 05 16:00:00 GMT + 2 2010

Здесь есть кое-что, чего мне не хватает. Мне нужно иметь возможность получить дату в формате GMT, вставить ее, конвертировать, сравнить, вычислить различия. Дата в часовом поясе пользователей нужна мне только тогда, когда мне нужно показать его ему.

Пожалуйста, просветите меня.

1 Ответ

2 голосов
/ 10 декабря 2010

Проблема заключается в том, что вы не храните часовой пояс. Вы сами сказали, что myStored при получении из того места, где вы его хранили, возвращается без TZ. Затем, когда вы вызываете parse для него, вы заставляете его использовать GMT. Поскольку время по Гринвичу на 2 часа отличается от вашего местного часового пояса, время на 2 часа отличается.

В двух словах, вы должны иметь возможность использовать время спутника, используйте формат simpledate с опцией z или Z, чтобы отформатировать вывод в том месте, где вы его храните. Вы даже не должны использовать метод setTimezone вообще. Затем используйте тот же формат даты, что и раньше, а не новый, для анализа даты поступления, с которой вы ее сохранили.

После того, как вы это сделали, перед отправкой вывода пользователю определите его часовой пояс, а затем установите часовой пояс для имеющихся у вас данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...