Отображение даты / времени в часовом поясе устройства на Android с помощью Kotlin - PullRequest
0 голосов
/ 20 октября 2018

Таким образом, мое приложение извлекает информацию из файла JSON с сервера, для которого есть несколько значений даты / времени.Время и дата указаны в UTC.Мне нужно отобразить их в моем приложении, в местном часовом поясе пользователей.

Пример данных из JSON:

"start":"2018-10-20 03:00:00","finish":"2018-10-20 05:00:00"

Мой код, который пока отображает дату и время,в UTC ..

val dateStringStart = radioScheduleDMList.get(position).start
        val dateStringEnd = radioScheduleDMList.get(position).finish

        val date = SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()).parse(dateStringStart)
        val dateEnd = SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()).parse(dateStringEnd)
        val day = SimpleDateFormat("d MMM").format(date)
        val startDate = SimpleDateFormat("ha").format(date)
        val endDate = SimpleDateFormat("ha").format(dateEnd)

Как я могу отображать эти данные, используя часовой пояс устройства?Я гуглил в течение нескольких часов.

Используя приведенный выше пример, мое приложение показывает «20 октября» для даты и «3 утра-5 утра» для времени.В моем случае, я живу в Австралии (время по Гринвичу + 10), поэтому я ожидаю, что день будет 20 октября и 13:00.Короче говоря, я хочу определить смещение часового пояса пользователя от UTC и применить его для отображения.

1 Ответ

0 голосов
/ 22 октября 2018

java.time и ThreeTenABP

    DateTimeFormatter jsonFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern("d MMM", Locale.forLanguageTag("en-AU"));
    DateTimeFormatter hourFormatter
            = DateTimeFormatter.ofPattern("ha", Locale.forLanguageTag("en-AU"));
    ZoneId zone = ZoneId.systemDefault();

    String dateStringStart = "2018-10-20 03:00:00";

    OffsetDateTime startDateTime = LocalDateTime.parse(dateStringStart, jsonFormatter)
            .atOffset(ZoneOffset.UTC);
    ZonedDateTime userStartDateTime = startDateTime.atZoneSameInstant(zone);
    String startDayString = userStartDateTime.format(dateFormatter);
    String startTimeString = userStartDateTime.format(hourFormatter);
    System.out.println("Start day:  " + startDayString);
    System.out.println("Start hour: " + startTimeString);

Извините, я не пишу Kotlin.Можете ли вы переводить с Java самостоятельно?Когда я запускаю приведенный выше код на JVM с часовым поясом по умолчанию Австралия / Брисбен, он выдает:

Start day:  20 Oct
Start hour: 1PM

Просто выполните аналогичные действия для даты и времени окончания.

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старых) Android используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

...