Формат Java Дата до UTC иногда выдает '???? - ?? - ?? T ??: ??: ??. ??? Z' - PullRequest
0 голосов
/ 05 июня 2018

В нашем приложении для Android у нас есть метод util для форматирования даты в формате UTC:

 static String formatToUTC(Date date) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        return dateFormat.format(date).replace(" ", "T") + "Z";
    }

, который иногда дает значение:

???? -?? - ?? T ??: ??: ??. ??? Z

Чтобы решить эту проблему, мы должны сначала воспроизвести ее, но мы не можем воспроизвести поведение.Мы пробовали разные локали и передали недопустимый новый Date () от Long.Max_VALUE, Long.MIN_VALUE.

Вопрос: что может быть причиной этой проблемы?

Заранее спасибо!

Отредактировано:

Дата - приложение для Android, созданное двумя способами:

  1. new Date();
  2. new Date(longValue)

Дата исходит от всего мира.

Отредактировано 2:

Проблема появляется на стороне сервера (написана на c # ).

Мы используем Ksoap2 для Android для взаимодействия с сервером и иногда не удается преобразовать ???? - ?? -?? T ??: ??: ??. ??? Z к объекту DateTime.Но главное время все хорошо.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

tl; dr

Instant.now().
       .truncatedTo( ChronoUnit.MILLISECONDS ) ;
       .toString()

2018-01-23T01: 23: 45.123Z

Вопрос безопасности потока?

То естьстранного поведения я не слышал.Мое первое предположение - проблема с многопоточностью.Унаследованные классы даты и времени не поточно-ориентированы.Их замены, классы java.time , полностью поточнобезопасны.

java.time

Вы можете заменить эти проблемные старые унаследованные классы.Они были вытеснены несколько лет назад на Java современными java.time классами.Для Android см. Маркеры ниже.

Instant

Класс java.util.Date был заменен на java.time.Instant.Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

Если вам нужны только миллисекунды, вы можете усечь любые микросекунды или наносекунды, которые могут присутствовать в вашем Instant.

Instant instantTruncated = instant.truncatedTo( ChronoUnit.MILLISECONDS ) ;

ISO 8601

Ваш желаемый формат вывода определяется стандартом ISO 8601 .

Классы java.time по умолчанию используют эти стандартные форматы при разборе / генерации строк.Поэтому не нужно указывать шаблон форматирования.

String output = instant.toString();

2018-01-23T01: 23: 45.123Z


О java.time

Фреймворк java.time встроен в 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 API с встроенной реализацией.
    • 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… .

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

0 голосов
/ 05 июня 2018

Чтобы помочь вам выяснить проблему, я бы проверил, содержит ли возвращаемая строка какие-либо знаки вопроса, и если да, то выдает исключение.Установите точку прерывания в своем исключении, и она должна позволить вам точно определить, какое значение нарушает вашу дату.

Что-то вроде:

static String formatToUTC(Date date) {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    String temp = dateFormat.format(date).replace(" ", "T") + "Z"

    if (temp.contains("?"))
        throw new IllegalArgumentException("Invalid date");  //set a breakpoint here

    return temp;
}

Надеюсь, это поможет

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