Когда и почему Вы использовали бы систематизатор свободного городского населения Apache?

tl; dr

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

myPreparedStatement                   // With JDBC 4.2, wa can directly exchange java.time objects with the database.
.setObject(                           // Pass a `OffsetDateTime` object representing the moment we want stored in the database.
    LocalDateTime.parse(              // Parse the input string lacking an indicator of offset or zone.
        "2019-01-19T19:00"            // When using strings in standard ISO 8601 format, no need to specify a formatting pattern.
    )                                 // Returns a `LocalDateTime`, an ambiguous value without real meaning.
    .atZone(                          // Apply a time zone to give meaning to the `LocalDateTime`. 
        ZoneId.of( "Europe/Paris" )   // Here we are saying "the 7 PM on that date as seen on the clock on the wall of someone standing in Paris France".
    )                                 // Returns a `ZonedDateTime` object.
    .toOffsetDateTime()               // Returns an `OffsetDateTime` object as demanded by the JDBC spec, stripping off the time zone to leave on the hours-minutes-seconds from UTC.
)

java.time

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

LocalDateTime

Разобрать вашу входную строку как LocalDateTime, так как в ней отсутствует индикатор часового пояса или смещения от UTC .

По возможности используйте стандартные форматы ISO 8601 для текста даты и времени. Для даты с временем суток будет YYYY-MM-DDTHH: MM: SS, где T отделяет часть даты от части времени.

String input = "2019-01-19T19:00" ;
LocalDateTime ldt = LocalDateTime.parse( input ) ; // No need to specify formatting pattern when using standard ISO 8601 formats.

ZonedDateTime

В классе LocalDateTime также отсутствует понятие зоны или смещения. Таким образом, объект этого класса не представляет момент, не является не точкой на временной шкале. Он представляет потенциальных моментов в диапазоне около 26-27 часов в различных часовых поясах по всему миру.

Похоже, вы наверняка знаете, что эта дата и время должны были представлять момент в определенном часовом поясе. Поэтому примените часовой пояс, чтобы придать смысл нашему неоднозначному LocalDateTime объекту.

Укажите собственное имя часового пояса в формате Continent/Region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 2-4-буквенное сокращение, такое как EST или IST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "Europe/Paris" ) ;  

Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента. Если опущен, код становится неоднозначным для чтения, поскольку мы не знаем наверняка, намеревались ли вы использовать значение по умолчанию или если вы, как и многие программисты, не знали об этой проблеме.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Теперь мы можем применить ZoneId, чтобы получить ZonedDateTime.

ZonedDateTime zdt = ldt.atZone( z ) ;

OffsetDateTime

Ваш JDBC может принимать объект ZonedDateTime, но спецификация JDBC 4.2 требует, чтобы он принимал OffsetDateTime. Какая разница? И ZonedDateTime, и OffsetDateTime представляют момент, точку на временной шкале. Смещение всего на несколько часов-минут-секунд вперед или назад по UTC. Часовой пояс гораздо больше. Часовой пояс - это история прошлых, настоящих и будущих изменений в смещении, используемом людьми определенного региона. Так что часовой пояс всегда предпочтительнее. За исключением случаев, когда мы используем JDBC для обмена объектом java.time с базой данных, мы используем OffsetDateTime для написания стандартного кода.

OffsetDateTime odt = zdt.toOffsetDateTime() ;  // Convert from moment with time zone to a moment with merely an offset-from-UTC.

Теперь мы можем передать этот момент вашему подготовленному заявлению.

myPreparedStatement( … , odt ) ;  // Pass a `OffsetDateTime` moment as the value for a placeholder in the SQL of your prepared statement.

Извлечение.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

Назначьте нужный часовой пояс.

ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = odt.atZone( z ) ;

И odt, и zdt, показанные в нескольких приведенных выше строках, представляют один и тот же момент одновременности, одну и ту же точку на временной шкале. Отличается только их время на настенных часах, так как большинство баз данных хранят и извлекают UTC, пока вы хотите видеть время по Парижу.


О java.time

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

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

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

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

Где взять классы java.time?

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

11
задан skaffman 18 May 2012 в 14:39
поделиться

3 ответа

От систематизатора Wiki

Почему Систематизатор использования?

Систематизатор является слоем сверху SAX xml синтаксический анализатор API, чтобы помочь обработать вход xml. В частности, систематизатор помогает создать и инициализировать дерево объектов на основе входного файла xml.

Наиболее популярный способ использования Систематизатора должен обработать конфигурационные файлы xml-формата, создав дерево объектов на основе той информации.

Обратите внимание, что систематизатор может создать и инициализировать истинные объекты, т.е. вещи, которые касаются бизнес-целей приложения и имеют реальные поведения. Много других инструментов имеют другую цель: создавать модель данных во входном XML-документе, как W3C DOM делает, но немного более дружественный.

и

И в отличие от инструментов, которые генерируют классы, можно записать классы приложения сначала, затем позже решить использовать Систематизатор для создания их из входного файла xml. Результат состоит в том, что Ваши классы являются реальными классами с реальными поведениями, которые, оказывается, инициализируются из XML-файла, а не простых "структур", которые просто содержат данные.

Как пример того, для чего это НЕ используется:

Если, однако, Вы ищете прямое представление входа xml документ как данные, а не истинные объекты, то систематизатор не для Вас; DOM, jDOM или другие более прямые обязательные инструменты будут более соответствующими.

Так, систематизатор отобразит XML непосредственно в объекты Java. В некоторых случаях это более полезно, чем необходимость прочитать дерево и вытащить опции.

10
ответ дан 3 December 2019 в 06:48
поделиться

My first take would be "never"... but perhaps it has its place. I agree with eljenso that it has been surpassed by competition.

So for good efficient and simple object binding/mapping, JAXB is much better, or XStream. Much more convenient and even faster.

EDIT 2019: also, Jackson XML, similar to JAXB in approach but using Jackson annotations

6
ответ дан 3 December 2019 в 06:48
поделиться

Если Вы хотите создать и инициализировать "истинные" объекты от XML, используйте достойный бобовый контейнер, как тот, обеспеченный Spring.

Кроме того, чтение в XML и обработка его самостоятельно использование XPath или использование Java/XML обязательные инструменты как Castor, хороши и возможно более стандартные альтернативы.

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

2
ответ дан 3 December 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: