Intereting Posts
Разница между Kivy и Java для приложений для Android Android: использование AUTO-CANCEL при уведомлении, когда ваше приложение работает в фоновом режиме Изменение цвета светодиода для уведомлений Как я могу сделать липкие заголовки в RecyclerView? (Без внешней библиотеки) Android Dex: НЕОПРЕДЕЛЕННЫЙ ТОП-УРОВЕННЫЙ ИСКЛЮЧИТЕЛЬ: Уже добавлено Конструкция обратной совместимости для дизайна материалов: colorAccent требует API уровня 21 при использовании appcompat7 Наложение цвета в андроид NDK Можно ли отображать значки в PopupMenu? Что делает класс LayoutInflater? (В Android) Как перезапустить ADB вручную из Android Studio Используя java-декомпилятор jd-gui и получение // INTERNAL ERROR // Консоль разработчика Google Play: бесплатное бета-тестирование платных приложений? Почему TextView в одной строке отображается с помощью «end» show boxes? Вкладки без значка Настройка прокси-сервера для эмулятора Android

Как преобразовать временную метку UTC в локальное время устройства в android

Мне нужно преобразовать отметку времени UTC, которую я получаю от сервера до локального времени устройства. В настоящее время я получаю разницу в 5 часов в свое время. Например, когда я отправляю сервер, время публикации говорит 5 часов назад, а не второй. Как исправить эту проблему. благодаря

Ниже приведен код, который я делаю

long timestamp = cursor.getLong(columnIndex); CharSequence relTime = DateUtils .getRelativeTimeSpanString(timestamp * 1000 + TimeZone.getDefault().getRawOffset(), System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS); ((TextView) view).setText(relTime); 

Solutions Collecting From Web of "Как преобразовать временную метку UTC в локальное время устройства в android"

Код в вашем примере выглядит с первого взгляда с первого взгляда. BTW, если временная метка сервера находится в UTC (т. Е. Это временная метка эпохи), тогда вам не нужно применять текущее смещение часового пояса. Другими словами, если временная метка сервера находится в UTC, вы можете просто получить разницу между временной отметкой сервера и системным временем ( System.currentTimeMillis() ), поскольку системное время находится в UTC (эпоха).

Я бы проверял, что метка времени, поступающая с вашего сервера, – это то, что вы ожидаете. Если временная метка с сервера не конвертируется в ожидаемую дату (в локальном часовом поясе), разница между временной меткой и текущим системным временем будет не такой, какой вы ожидаете.

Используйте Calendar чтобы получить текущий часовой пояс. Инициализировать SimpleDateFormatter с текущим часовым поясом; Затем запишите временную метку сервера и убедитесь, что это ожидаемая дата:

 Calendar cal = Calendar.getInstance(); TimeZone tz = cal.getTimeZone(); /* debug: is it local time? */ Log.d("Time zone: ", tz.getDisplayName()); /* date formatter in local timezone */ SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); sdf.setTimeZone(tz); /* print your timestamp and double check it's the date you expect */ long timestamp = cursor.getLong(columnIndex); String localTime = sdf.format(new Date(timestamp * 1000)); // I assume your timestamp is in seconds and you're converting to milliseconds? Log.d("Time: ", localTime); 

Если время сервера, которое было напечатано , не соответствует ожидаемому, то время вашего сервера не указано в UTC.

Если время сервера, которое было напечатано, – это дата, которую вы ожидаете, тогда вам не придется применять к нему rawoffset. Таким образом, ваш код будет проще (за вычетом всего журнала отладки):

 long timestamp = cursor.getLong(columnIndex); Log.d("Server time: ", timestamp); /* log the device timezone */ Calendar cal = Calendar.getInstance(); TimeZone tz = cal.getTimeZone(); Log.d("Time zone: ", tz.getDisplayName()); /* log the system time */ Log.d("System time: ", System.currentTimeMillis()); CharSequence relTime = DateUtils.getRelativeTimeSpanString( timestamp * 1000, System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS); ((TextView) view).setText(relTime); 
 int gmtOffset = TimeZone.getDefault().getRawOffset(); long now = System.currentTimeMillis() + gmtOffset; 

Преобразование даты в строку «2011-06-23T15: 11: 32» в наш часовой пояс.

 private String getDate(String OurDate) { try { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); Date value = formatter.parse(OurDate); SimpleDateFormat dateFormatter = new SimpleDateFormat("MM-dd-yyyy HH:mm"); //this format changeable dateFormatter.setTimeZone(TimeZone.getDefault()); OurDate = dateFormatter.format(value); //Log.d("OurDate", OurDate); } catch (Exception e) { OurDate = "00-00-0000 00:00"; } return OurDate; } 

Местный для UTC

 DateTime dateTimeNew = new DateTime(date.getTime(), DateTimeZone.forID("Asia/Calcutta")); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); String datetimeString = dateTimeNew.toString("yyyy-MM-dd HH:mm:ss"); long milis = 0; try { milis = simpleDateFormat.parse(datetimeString).getTime(); } catch (ParseException e) { e.printStackTrace(); } 

У меня есть что-то подобное, чтобы получить дату в часовом поясе локального устройства с отметки времени UTC.

 private long UTC_TIMEZONE=1470960000; private String OUTPUT_DATE_FORMATE="dd-MM-yyyy - hh:mm a" getDateFromUTCTimestamp(UTC_TIMEZONE,OUTPUT_DATE_FORMATE); 

Вот функция

  public String getDateFromUTCTimestamp(long mTimestamp, String mDateFormate) { String date = null; try { Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.setTimeInMillis(mTimestamp * 1000L); date = DateFormat.format(mDateFormate, cal.getTimeInMillis()).toString(); SimpleDateFormat formatter = new SimpleDateFormat(mDateFormate); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); Date value = formatter.parse(date); SimpleDateFormat dateFormatter = new SimpleDateFormat(mDateFormate); dateFormatter.setTimeZone(TimeZone.getDefault()); date = dateFormatter.format(value); return date; } catch (Exception e) { e.printStackTrace(); } return date; } 

Результат:

 12-08-2016 - 04:30 PM 

Надеюсь, это сработает для других.

Это может помочь кому-то с тем же требованием

 private String getDate(long time){ SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm a"); String dateString = formatter.format(new Date(time)); String date = ""+dateString; return date; }