Конвертировать 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, поэтому не является надежным.