Даты Java парсинг с микросекунды или наносекунды точность

по словам класса simpledateformat класс документация, Java не поддерживает детализацию времени выше миллисекунд в шаблонах дат.

Итак, строка даты, как

  • 2015-05-09 00:10:23.999750900 // последние 9 цифр обозначают наносекунд

при анализе через шаблон

  • гггг-ММ-ДД чч:мм:СС.SSSSSSSSS / / 9 'S' символы

фактически интерпретирует все число после . символ как (почти 1 миллиард!) миллисекунды, а не наносекунды, в результате чего дата

  • 2015-05-20 21:52: 53 UTC

т. е. на 11 дней вперед. Удивительно, используя меньшее количество S символы по-прежнему приводят к анализу всех 9 цифр (вместо, скажем, крайнего левого 3 для .SSS).

есть 2 способа решить эту проблему правильно:

  • использовать строку препроцессирование
  • используйте пользовательскую реализацию SimpleDateFormat

был бы какой-либо другой способ получить правильное решение, просто поставив шаблон в стандарт SimpleDateFormat реализация, без каких-либо других изменений кода или манипуляций со строками?

1 ответов


tl; dr

LocalDateTime.parse(                 // With resolution of nanoseconds, represent the idea of a date and time somewhere, unspecified. Does *not* represent a moment, is *not* a point on the timeline. To determine an actual moment, place this date+time into context of a time zone (apply a `ZoneId` to get a `ZonedDateTime`). 
    "2015-05-09 00:10:23.999750900"  // A `String` nearly in standard ISO 8601 format.
    .replace( " " , "T" )            // Replace SPACE in middle with `T` to comply with ISO 8601 standard format.
)                                    // Returns a `LocalDateTime` object.

Неа

нет, вы не можете использовать SimpleDateFormat для обработки наносекунд.

но ваша предпосылка, что...

Java не поддерживает гранулярность времени выше МС в его датах

...больше не верно, как Java 8, 9, 10 и позднее с java.время классы встроенный. И не совсем верно для Java 6 и Java 7 либо, как большинство java.время функции портированы.

java.время

SimpleDateFormat, и связанные с java.util.Date/.Calendar классы теперь устарели от нового java.время пакет найден в Java 8 (учебник).

новая java.поддержка классов времени НС. The Z на конце означает UTC, произносится "Зулу".

instant.toString()  // Generate a `String` representing this moment, using standard ISO 8601 format.

2013-08-20T12: 34: 56.123456789 Z

обратите внимание, что захват текущего момента в Java 8 ограничен разрешением миллисекунды. The java.время классы провести значение в наносекундах, но может определить только текущее время с миллисекундами. Это ограничение связано с реализацией Clock. В Java 9 и более поздних версиях новый Clock реализация может захватить текущий момент в более высоком разрешении, в зависимости от ограничений вашего хост-оборудования и операционной системы, обычно микросекунд по моему опыту.

Instant instant = Instant.now() ;  // Capture the current moment. May be in milliseconds or microseconds rather than the maximum resolution of nanoseconds.

LocalDateTime

ваш пример входной строки 2015-05-09 00:10:23.999750900 отсутствует индикатор часового пояса или смещения от UTC. Это означает, что делает не представляем момент, есть не точка на временной шкале. Вместо этого он представляет потенциал моменты вдоль ряда около 26-27 часов, ряд времени зоны по всему миру.

Pares такой вход, как , теперь режим обслуживания, советует миграция в java.время классы.

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

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

где получить java.время занятий?

  • Java SE 8, Java SE 9, Java SE 10, и позже
    • встроенный.
    • часть стандартного API Java со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android

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