tl;dr
Не, не го правите.
- Бази данни като Oracle съхраняват стойности за дата-час със собствени вътрешно дефинирани двоични стойности, а не като обикновен текст.
- Oracle
DATE
type съдържа час от деня, както и дата.
DATE
=дата + час от деня
DATE
тип в базата данни на Oracle е погрешно именуван. Съдържа повече от дата (година, месец и ден от месеца).
Този тип представлява дата с час от деня, разрешаващ до цели секунди. Този тип няма контекст на часова зона или отместване спрямо UTC. Така че този тип не може да се използва за представяне на момент, конкретна точка от времевата линия. (За да проследите момент, използвайте тип Oracle TIMESTAMP WITH TIME ZONE
.)
Имайте предвид, че това именуване на Oracle се различава от стандарта SQL. В стандарта, DATE
type е стойност само за дата, без час от деня и без часова зона или отместване.
java.time.LocalDateTime
Така че този тип съответства на LocalDateTime
в Java.
Извличане.
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
Съхранение.
myPreparedStatement.setObject( … , ldt ) ;
Текст
Забележете, че в кода по-горе използваме интелигентни обекти, а не глупави низове.
Обекти за дата-час като LocalDateTime
не са String
и не задържайте текст. Те вътрешно представят стойността си по свой начин. Можете да анализирате низ като обект за дата-час и можете да поискате от обекта за дата-час да генерира текст. Но текстът и обектът за дата-час са отделни и различни.
java.time класовете използват стандартен ISO 8601 формати при анализиране/генериране на низове.
String output = ldt.toString() ;
Разбор.
Можете да генерирате текст в други формати. Можете да зададете свой собствен персонализиран формат, като извикате DateTimeFormatter.ofPattern
. Обикновено е по-добре да форматирате автоматично чрез извикване на DateTimeFormatter.ofLocalized…
методи.
Това вече е разгледано много пъти в Stack Overflow. Така че търсете, за да научите повече.
LocalDateTime ldt = LocalDateTime.parse( "2020-01-23T01:23:45.123456789" ) ;
Относно java.time
java.time
framework е вграден в Java 8 и по-нови версии. Тези класове изместват проблемното старо наследство
класове дата-час като java.util.Date
, Calendar
, &SimpleDateFormat
.
За да научите повече, вижте урок за Oracle . И потърсете в Stack Overflow много примери и обяснения. Спецификацията е JSR 310 .
Joda-Time проект, сега в режим на поддръжка , съветва миграция към java.time класове.
Можете да обменяте java.time обекти директно с вашата база данни. Използвайте JDBC драйвер
съвместим с JDBC 4.2
или по-късно. Няма нужда от низове, няма нужда от java.sql.*
класове. Hibernate 5 и JPA 2.2 поддържат java.time .
Къде да получа класовете java.time?
- Java SE 8
, Java SE 9
, Java SE 10
, Java SE 11
, и по-късно - Част от стандартния Java API с пакетна реализация.
- Java 9 добавя някои незначителни функции и поправки.
- Java SE 6
и Java SE 7
- По-голямата част от java.time функционалността е пренесена обратно към Java 6 и 7 в ThreeTen-Backport .
- Android
- По-късни версии на Android пакетни реализации на java.time класове.
- За по-стар Android (<26), ThreeTenABP проектът адаптира ThreeTen-Backport (споменати по-горе). Вижте Как да използвате ThreeTenABP… .