Преобразовать строку даты и времени (2018-04-13T20: 00: 00.0400) в строку даты (13 апреля 2018 года) в Котлине - PullRequest
0 голосов
/ 11 октября 2018

Я хочу преобразовать строку DateTime, например "2018-04-13T20: 00: 00.0400", в "13 апреля 2018 года".Я использовал код

val sdf = SimpleDateFormat("yyyy/mm/dd", Locale.getDefault())
val startDate = sdf.parse(data.start_time)

, но с этим кодом мое приложение вылетает.Любая помощь относительно этого

Журнал показывает это

2018-10-11 16:44:56.948 20482-21021/? E/NowController: Failed to access data from EntryProvider. ExecutionException.
java.util.concurrent.ExecutionException: com.google.android.apps.gsa.sidekick.main.h.n: Could not complete scheduled request to refresh entries. ClientErrorCode: 3
    at com.google.common.util.concurrent.d.eA(SourceFile:85)
    at com.google.common.util.concurrent.d.get(SourceFile:23)
    at com.google.common.util.concurrent.l.get(SourceFile:2)
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.be.cbB(SourceFile:49)
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.be.cbA(SourceFile:181)
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.bh.run(Unknown Source:2)
    at com.google.android.apps.gsa.shared.util.concurrent.at.run(SourceFile:4)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at com.google.android.apps.gsa.shared.util.concurrent.b.g.run(Unknown Source:4)
    at com.google.android.apps.gsa.shared.util.concurrent.b.aw.run(SourceFile:4)
    at com.google.android.apps.gsa.shared.util.concurrent.b.aw.run(SourceFile:4)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)
    at com.google.android.apps.gsa.shared.util.concurrent.b.i.run(SourceFile:6)
 Caused by: com.google.android.apps.gsa.sidekick.main.h.n: Could not complete scheduled request to refresh entries. ClientErrorCode: 3
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.ar.az(Unknown Source:4)
    at com.google.common.util.concurrent.q.ap(SourceFile:7)
    at com.google.common.util.concurrent.p.run(SourceFile:32)
    at com.google.common.util.concurrent.bt.execute(SourceFile:3)
    at com.google.common.util.concurrent.d.b(SourceFile:275)
    at com.google.common.util.concurrent.d.addListener(SourceFile:135)
    at com.google.common.util.concurrent.p.b(SourceFile:3)
    at com.google.android.apps.gsa.shared.util.concurrent.h.a(SourceFile:16)
    at com.google.android.apps.gsa.shared.util.concurrent.h.a(SourceFile:13)
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.be.cbB(SourceFile:47)

Ответы [ 3 ]

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

Фиксированная версия выше, так как ваш ввод даты не имеет Z в нем.И их формат вывода не соответствует вашему.Я бы посоветовал прочесть документы https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html, чтобы вы могли изменять ответы по мере необходимости.

fun convertISOTimeToDate(isoTime: String): String? {
    val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
    var convertedDate: Date? = null
    var formattedDate: String? = null
    try {
        convertedDate = sdf.parse(isoTime)
        formattedDate = SimpleDateFormat("MMMMM dd,yyyy").format(convertedDate)
    } catch (e: ParseException) {
        e.printStackTrace()
    }

    return formattedDate
}
0 голосов
/ 12 октября 2018

tl; dr

Используйте современные java.time классы, никогда не ужасные унаследованные классы.

Вот синтаксис Java (я еще не изучил Kotlin).

LocalDateTime                             // Represent a date with time-of-day but lacking offset-from-UTC or time zone. As such, this does *not* represent a moment, is *not* a point on the timeline.
.parse( "2018-04-13T20:00:00.0400" )      // Parse an input string in standard ISO 8601 format. Returns a `LocalDateTime` object.
.toLocalDate()                            // Extract the date-only portion without the time-of-day. Still no time zone or offset-from-UTC. Returns a `LocalDate` object.
.format(                                  // Generate text representing the value of that `LocalDate` object.
    DateTimeFormatter                     // Define a pattern to use in generating text.
    .ofLocalizedDate( FormatStyle.LONG )  // Automatically localize, specifying how long/abbreviated…
    .withLocale( Locale.US )              // … and what human language and cultural norms to use in localizing.
)                                         // Return a `String`. 

13 апреля 2018

Для более ранних версий Android см. Маркеры внизу ниже.

Использование java.time

преобразовать строку DateTime, например "2018-04-13T20: 00: 00.0400", в "13 апреля 2018".

Вы используете ужасную старую дату-классы времени, которые были вытеснены годами назад классами java.time .

Сначала проанализируйте входную строку.Но что это за .0400 на конце?Возможно, доли секунды?Но обычно миллисекунды, микросекунды или наносекунды отображаются группами по 3 цифры.Так что ваши четыре цифры здесь странные.Возможно смещение от UTC?Для этого подходят четыре цифры: часы и минуты с нулем в начале.Но нет знака плюс или минус , чтобы указать впереди или позади UTC.Так что я пойду с долей секунды.

В вашем входе отсутствует индикатор смещения от UTC или часового пояса.Так что разбери как LocalDateTime.Ваша строка в стандартном формате ISO 8601.Стандартные форматы по умолчанию используются в классах java.time .

String input = "2018-04-13T20:00:00.0400";
LocalDateTime ldt = LocalDateTime.parse( input );

ldt.toString (): 2018-04-13T20: 00: 00.040

Извлечение части даты.

LocalDate ld = ldt.toLocalDate() :

ld.toString (): 2018-04-13

Создание текста, представляющего значение этой даты.Пусть java.time автоматически локализуется.Для локализации укажите:

  • FormatStyle, чтобы определить, как долго или сокращенно должна быть строка.
  • Locale доопределить:
    • человеческий язык для перевода названия дня, названия месяца и т. д.
    • культурных норм решения вопросов сокращения, заглавные буквы, пунктуация, разделители и т. п.

Код:

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.LONG ).withLocale( Locale.US );
String output = ld.format( f );

13 апреля 2018

Осторожно: A LocalDateTime объект - не момент, не точка на временной шкале.Отсутствие какого-либо смещения от UTC или часового пояса означает, что оно представляет диапазон потенциальных моментов в диапазоне около 26-27 часов (текущий диапазон часовых поясов по всему миру).Если входная строка неявно предназначалась для представления момента времени настенного времени некоторого региона, вы должны применить ZoneId, чтобы получить объект ZonedDateTime, прежде чем извлекать LocalDate.Это было показано много раз ранее при переполнении стека.


О java.time

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

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

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

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

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 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… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

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

Вам необходимо правильно отформатировать.Попробуйте приведенный ниже код, который вы должны конвертировать из формата даты ISO в обычный формат даты. Спасибо

fun convertISOTimeToDate(isoTime: String): String? {
        val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
        var convertedDate: Date? = null
        var formattedDate: String? = null
        try {
            convertedDate = sdf.parse(isoTime)
            formattedDate = SimpleDateFormat("dd-MM-yyyy" + "\n" + " hh:mm:ss a").format(convertedDate)
        } catch (e: ParseException) {
            e.printStackTrace()
        }

        return formattedDate
    }
...