Как конвертировать время в милиСек из UTc в местное время в милиСек
Я получаю время с сервера в миллисекундах и пытаюсь преобразовать его в местное время. Я хочу передать его в PrettyTime Using Java следующим образом:
PrettyTime p = new PrettyTime();
long millisec = 1522034539973;
String time = p.format(new Date(millisec));
Но результатом является относительное время от времени UTC, предоставленное currentTime; Что мне нужно, это конвертировать millisec
по местному времени в миллисекундах. Пожалуйста помоги!
PS: я использую Android
3 ответа
Вы можете попытаться получить время от java.util.Calendar. Вот пример:
Calendar.getInstance(TimeZone.getDefault()).getTimeInMillis()
Также вы можете узнать время по конкретной локали:
Calendar.getInstance(Locale.getDefault()).getTimeInMillis()
Ваш код правильный.
Если вы действительно используете значение миллисекунды, полученное с сервера, то я подозреваю, что что-то неправильно написано на стороне сервера.
Имейте в виду, что даты представляют моменты времени и не содержат часовых поясов.
Текущие "миллисекунды" представляют, как говорится в документации, "разницу, измеряемую в миллисекундах, между текущим временем и полночью, 1 января 1970 года по Гринвичу (всемирное координированное время)" - таким образом, смещение от "даты эпохи" в миллисекундах,
Даты не имеют часовых поясов, пока вы не отформатируете их для конкретной зоны - они просто содержат это смещение в миллисекундах.
Итак, если вы получаете время, отличное от ожидаемого, либо сервер отправляет неверное значение, либо PrettyTime выводит неверный локальный часовой пояс при вызове format(). PrettyTime использует текущую настройку Locale, так что, вероятно, проблема не в этом.
Я предлагаю вам проверить, является ли проблема с временем на сервере, протестировав PrettyTime с локально сгенерированной датой, примерно так:
Date now = new Date();
System.out.println(p.format(now));
Если вы действительно хотите убедить себя, что все в порядке на стороне клиента, попробуйте это:
Date now = new Date();
long msec = now.getTime();
Date theDate = new Date(msec);
System.out.println(p.format(theDate));
Кроме того, чтобы узнать, что сервер на самом деле отправляет вам, https://currentmillis.com/ может показать вам текущее время в миллисекундах и преобразовать миллис в удобочитаемые форматы.
ответ от Link182 не работает. он все еще получает мили UTC.
этот код работает:
long mili_UTC = System.currentTimeMillis(); // ex: 1687067040633
TimeZone tz = TimeZone.getDefault();
long offsetFromUtc = tz.getOffset(mili_UTC);
// will get miliseconds of local timezone
long mili_Of_Local = mili_UTC + offsetFromUtc; // ex: 1687092240633