Конвертировать UTC в локальное время на Android

В моем проекте у меня есть ответ API в формате json. Я получаю строковое значение времени в формате времени UTC, как этот Jul 16, 2013 12:08:59 AM.
Мне нужно изменить это на локальное время. Именно там мы используем это приложение, чтобы показать местное время. Как это сделать?

Вот какой код я пробовал:

String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(aDate);

Предположим, что aDate содержит Jul 16, 2013 12:08:59 AM

Ответы

Ответ 1

Здесь моя попытка:

String dateStr = "Jul 16, 2013 12:08:59 AM";
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);

Также обратите внимание на "a" для маркера am/pm...

Ответ 2

Введите следующий код.

TimeZone defaultTimeZone = TimeZone.getDefault();
String strDefaultTimeZone = defaultTimeZone.getDisplayName(false, TimeZone.SHORT);

//Your Code
String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone(strDefaultTimeZone));
String formattedDate = simpleDateFormat.format(aDate);

Это должно работать.

Ответ 3

//your UTC time var
long time = UTCtime;

//convert it
Time timeFormat = new Time();
timeFormat.set(time+TimeZone.getDefault().getOffset(time));

//use the value
long localTime = timeFormat.toMillis(true);

Ответ 4

Я хотел бы внести современный ответ. В то время как SimpleDateFormat был классом, который мы использовали для разбора и форматирования дат-времени в 2013 году (кроме Joda-Time), он теперь устарел, и мы намного лучше в java.time или JSR-310, современной Java API даты и времени, который вышел с Java 8 в 2014 году.

Но большинство устройств Android все еще не запускают Java 8, я слышал, вы говорите. К счастью, вы все еще можете использовать современный API дат и времени Java для них через ThreeTenABP, backport JSR-310 для Android Java 7. Детали находятся в этом вопросе: как использовать ThreeTenABP в Проект Android.

Теперь код:

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH);
    String aDate = "Jul 16, 2013 12:08:59 AM";
    String formattedDate = LocalDateTime.parse(aDate, formatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(ZoneId.systemDefault())
            .format(formatter);
    System.out.println(formattedDate);

Поскольку на моем компьютере работает часовой пояс в Европе/Копенгагене, который в июле на 2 часа превышает UTC, это печатает

Jul 16, 2013 02:08:59 AM

Другие пункты:

  • Поскольку у вас есть AM в вашей строке, я предположил, что ваши часы находятся в пределах AM, с 1 по 12. Для правильной разборки и форматирования вам требуется строчная строка h в строке шаблона форматирования. Верхний регистр h предназначен для часового дня от 0 до 23.
  • Предпочитаете присвоить языковой стандарт explcit для форматирования (будь то SimpleDateFormat или DateTimeFormatter). Если языковой стандарт не задан, форматировщик будет использовать локаль по умолчанию для устройств. "Jul" и "AM" находятся на английском языке, и ваш код может хорошо работать на многих устройствах, пока один из них не будет работать на устройстве с неанглийской локалью и сбоями, и вам сложно понять, почему.
  • Если вы можете, укажите желаемый часовой пояс, например, как ZoneId.of("Asia/Kolkata"). Часовой пояс JVM по умолчанию может быть изменен другими частями вашей программы или другими программами, работающими в одной JVM, поэтому не является надежным.