Android - конвертировать время по Гринвичу во время по местному времени - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь преобразовать время UT C в время пользователя. Тем не менее, я возвращаюсь в то же время UT C. Видимо, установка часового пояса на локаль / по умолчанию не работает.

Другой способ, по-видимому, доступен с использованием Instant, но требует уровня API 26.

Это моя дата ввода в строке: "2020-01-16T19: 44: 48.303 + 0000". Я ожидаю, что дата и время будут в следующем формате: «М / дд / гг - ч: мм аа»

private String toLocaleTime(String timeStr){
    // Date date;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'+0000'");
        simpleDateFormat.setTimeZone(TimeZone.getDefault());

        String localeTime = "";
        try {
            //date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US).parse(timeStr);
            localeTime = simpleDateFormat.format(simpleDateFormat.parse(timeStr));

        } catch (ParseException e) {
            e.printStackTrace();
        }
        //String str = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US).format(date);
        Log.d("LocaleTime", ""+ localeTime);
        return localeTime;
}

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

java .time

A Locale не имеет ничего общего с содержимым объекта даты и времени. Локаль входит в изображение только при генерации текста для представления значения объекта даты и времени. Я подозреваю, что ваше намерение состоит в том, чтобы скорректировать смещение от UT C часов-минут-секунд до времени настенных часов, используемого людьми определенного региона (часового пояса).

Никогда используйте SimoleDateFormat или Date или Calendar. Эти ужасные классы даты и времени были вытеснены java .time лет a go. Для Android до 26 добавьте ThreeTenABP библиотеку в ваш проект.

Это моя дата ввода в строке: "2020-01-16T19: 44: 48.303 + 0000"

Совет. Классы java .time и другие структуры даты и времени работают лучше, если включить двоеточие символ между часами и секундами в смещении: +00:00.

Если все ваши входы имеют одинаковое смещение, замените эту часть строки.

String input = "2020-01-16T19:44:48.303+0000".replace( "+0000" , "+00:00" ) ;

Разобрать как Instant, момент в UT C.

Instant instant = Instant.parse( input ) ;

Генерация строки в нужном формате. Вы действительно хотите один git месяц с двумя git днем? И один ди git час с двумя ди git минутами?

DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/dd/uu - h:mm a" ).withLocale( locale ) ;
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
String output = instant.atZone( z ).format( z ) ;

Я предлагаю вместо этого позволить java .time автоматически локализовать для вас с DateTimeFormatter.ofLocalizedDateTime.


О java .time

java .time интегрирован в Java 8 и позже. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Учебник Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация: JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует переход на java .time классы.

Вы можете обмениваться java .time объектами напрямую с вашей базой данных. Используйте драйвер JDB C , совместимый с JDB C 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где взять классы java .time?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 и более поздних версий - часть стандартного API Java со связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большинство функций java .time перенесено на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android связывают реализации классов java .time .
    • Для более ранних Android (<26), <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP проект адаптируется ThreeTen-Backport (упомянуто выше). См. Как использовать ThreeTenABP… .
0 голосов
/ 05 февраля 2020

Вы указываете синтаксическому анализатору даты на синтаксический анализ с использованием часового пояса UT C, а форматирование форматирует дату для форматирования с использованием часового пояса по умолчанию (ничего не сообщая ):

String input = "2020-01-16T19:44:48.303+0000";

SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'+0000'");
inputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = inputFormat.parse(input);

SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
// Not needed:  outputFormat.setTimeZone(TimeZone.getDefault());
String output = outputFormat.format(date);

System.out.println("input:  " + input);
System.out.println("output: " + output);
System.out.println(new SimpleDateFormat("zzzz  XX").format(date));

Выход

input:  2020-01-16T19:44:48.303+0000
output: 2020-01-16T14:44:48.303
Eastern Standard Time  -0500
...