Выпуск форматера даты при разборе даты типа «2020-03-30T07: 37: 02.282 + 01: 00» я должен отформатировать в форме сегодня в 12:30. - PullRequest
0 голосов
/ 01 апреля 2020

Возникла проблема при форматировании даты и времени типа "2020-03-30T07: 37: 02.282 + 01: 00", и я получаю дату с моего сервера в этих двух форматах "2020-03-30T07: 37: 02.282 + 01: 00 "и« 2020-03-30T05: 44: 02.397Z »Я думаю, что я использую правильное время, но не уверен, что при разборе я получаю ожидаемое синтаксическое ожидание для типа даты« 2020-03-30T07: 37: 02.282 + 01: 00 ", но я могу разобрать дату типа« 2020-03-30T05: 44: 02.397Z ». Код, который я использую для форматирования даты:

    fun formatToYesterdayOrToday(responseTime: String?): String? {
    val dateTime: Date =
        SimpleDateFormat(
            "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'",
            Locale.getDefault()
        ).parse(responseTime)
    val calendar: Calendar =
        Calendar.getInstance()
    calendar.time = dateTime
    val today: Calendar =
        Calendar.getInstance()
    val yesterday: Calendar =
        Calendar.getInstance()
    yesterday.add(Calendar.DATE, -1)
    val timeFormatter: DateFormat =
        SimpleDateFormat("hh:mma", Locale.getDefault())
    val dateFormatter: DateFormat =
        SimpleDateFormat("dd-MM-yyyy", Locale.getDefault())
    return if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) &&
        calendar.get(Calendar.DAY_OF_MONTH) == today.get(Calendar.DAY_OF_MONTH) &&
        calendar.get(Calendar.MONTH) == today.get(Calendar.MONTH)
    ) {
        "Updated: " + setAmPmToLowercase(timeFormatter.format(dateTime)) + " today"
    } else if (calendar.get(Calendar.YEAR) == yesterday.get(Calendar.YEAR) &&
        calendar.get(Calendar.DAY_OF_MONTH) == yesterday.get(Calendar.DAY_OF_MONTH) &&
        calendar.get(Calendar.MONTH) == yesterday.get(Calendar.MONTH)
    ) {
        "Updated: " + setAmPmToLowercase(timeFormatter.format(dateTime) + " yesterday")
    } else {
        "Updated on: " + dateFormatter.format(dateTime) + " at " + setAmPmToLowercase(
            timeFormatter.format(dateTime)
        )
    }
}

Может Кто-нибудь, пожалуйста, помогите мне с тем, что не так с моим кодом?

1 Ответ

1 голос
/ 02 апреля 2020

Эти две строки - 2020-03-30T07:37:02.282+01:00 и 2020-03-30T05:44:02.397Z - имеют одинаковый формат. Формат ISO 8601 (см. Ссылку внизу). В ISO 8601 смещение от UT C (или GMT) может быть задано либо Z для нуля, либо, например, +01:00 для 1 часа 0 минут (существует больше вариантов).

Вам следует предпочитайте использовать java .time, современный Java API даты и времени, для вашей работы с датой и временем. Также java.time.OffsetDateTime анализирует ISO 8601 как значение по умолчанию, то есть без какого-либо явного средства форматирования. Поэтому нам не нужно думать о строке шаблона формата. В Java:

    OffsetDateTime dateTime
            = OffsetDateTime.parse("2020-03-30T07:37:02.282+01:00");
    System.out.println(dateTime);
    dateTime = OffsetDateTime.parse("2020-03-30T05:44:02.397Z");
    System.out.println(dateTime);

Вывод:

2020-03-30T07:37:02.282+01:00
2020-03-30T05:44:02.397Z

Вы заметили, что OffsetDateTime.toString() (неявно вызывается при печати объекта) возвращает ISO 8601 форматировать тоже.

Даже если нам нужно было написать строку шаблона форматирования для форматера, вы должны никогда жесткий код Z как литерал (заключив его в одинарные кавычки). Как я уже сказал, Z - это смещение от UT C, и его нужно анализировать как таковое, иначе вы не сможете проанализировать строку, или, что еще хуже, вы рискуете получить неверные результаты от этого. По всей вероятности, вы получили неправильный результат, когда сказали, что можете анализировать 2020-03-30T05:44:02.397Z.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...