Ответ
Работаю по московскому времени (MSK, UTC+3). Это стандарт для большинства проектов в России.
Для работы с временем в Android использую:
val currentTime = System.currentTimeMillis() // UTC timestamp
val formatter = SimpleDateFormat("HH:mm", Locale.getDefault())
formatter.timeZone = TimeZone.getDefault() // Учитывает таймзону устройства
val localTime = formatter.format(Date(currentTime))
Рекомендую всегда:
- Хранить время в UTC
- Конвертировать в локальную зону только для отображения
- Использовать
java.time(API 26+) или ThreeTenABP для обратной совместимости
Ответ 18+ 🔞
А, ну вот, классика жанра, ебать мои старые костыли! Опять про время и таймзоны. Чувак, это же пиздец, сколько народу на этом обжигается, как будто впервые слышат.
Смотри, тут всё просто, как два пальца обоссать. Ты говоришь, работаешь по Москве. Ну, допустим. Но твой сервер-то где? В Амстердаме? В Ирландии? А пользователь твой вообще в Хабаровске сидит, с пивом и вяленой рыбой. И вот тут начинается ёперный театр.
Ты пишешь System.currentTimeMillis(). Это, блядь, святое. Это твой UTC, твоя точка отсчёта, твой якорь в бушующем море ебучих часовых поясов. Это как золотой запас — храни его и не трогай. Запомни раз и навсегда: храни всё в UTC. В базу, в память, в файл — только UTC. Это твой спасательный круг.
А вот когда надо челу на экране циферки показать — вот тут уже включай мозги. Берёшь свой священный UTC-таймстамп и говоришь системе: «Э, сабака сука, дай-ка мне время для этого конкретного телефона, с его настройками, с его городом». Как у тебя в примере: TimeZone.getDefault(). Это и есть магия. Устройство само знает, где оно находится (ну, или думает, что знает). Ты ему UTC, а оно тебе — «14:30 по Хабаровску» или «07:30 по Москве».
Но слушай сюда, главный совет, от которого у тебя волнение ебать пройдёт. Твой SimpleDateFormat — это как дедушкин «Москвич»: вроде едет, но то заводится через раз, то печка дымит. Он старый, он неудобный, он потоконебезопасный, ёклмн!
Если твоё приложение летает только на новых андроидах (API 26 и выше), бросай эту старь в утиль и бери java.time. Это как пересесть с «Москвича» на новенький внедорожник. Всё там есть: и ZonedDateTime, и Instant, и ZoneId. Красота!
// Для современных (API 26+)
val zonedTime = Instant.now().atZone(ZoneId.systemDefault())
println(zonedTime.format(DateTimeFormatter.ofPattern("HH:mm")))
А если нужно поддерживать старые девайсы, где ещё хуй с горы не валялся? Тогда твой лучший друг — библиотека ThreeTenABP. Это, по сути, тот же мощный java.time, но запихнутый назад, для древних версий. Подключаешь одну зависимость, и у тебя весь арсенал современной работы со временем доступен даже на Android 4.0. Это не совет, это необходимость. Все так делают.
Итог простой, как три копейки:
- Внутри (логика, хранение) — всегда UTC.
System.currentTimeMillis()илиInstant.now(). - Снаружи (показ пользователю) — конвертируй в локальную зону устройства (
ZoneId.systemDefault()). - Инструменты — забудь про
SimpleDateFormat. Либоjava.time(для новых), либо ThreeTenABP (для всех остальных).
Следуй этим правилам, и у тебя никогда не будет ситуации, когда пользователь в Калининграде видит время отправки сообщения как будущее, а его собеседник во Владивостоке — уже как прошлое. А то ведь доверия ебать ноль к такому приложению будет. Всё, вопрос закрыт.