Intereting Posts
Android: создание родительского макета и расширение его, чтобы поддерживать одинаковый внешний вид во всех действиях приложения Как преобразовать объект JSONObject в объект класса? Почему элемент «Фрагмент» в макете Android написан с нижним регистром «f»? Как я могу переадресовать входящие SMS с определенным текстом EditText удваивается при вращении Взрывная анимация просмотра в андроиде Есть ли тип Long в SQLite? Странная проблема с webview goBack в android NavigationView: как вставить разделитель без подгруппы? AmazonServiceException: Пользователь не имеет права выполнять: dynamodb: DescribeTable Код состояния: 400; Код ошибки: AccessDeniedException GetExtra от Intent, запущенного из ожидающего Есть ли способ заставить Snackbar сохраняться среди изменений активности? Вырезать экран телефона на две части, которые одновременно выполняют две вещи Как вы можете прокручивать LinearLayout? Запрос поставщика контента для Android из командной строки (оболочка adb)

Как преобразовать временную метку 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; }