Відповіді:
За Timestamp
, я вважаю , ви маєте в виду java.sql.Timestamp
. Ви помітите, що в цьому класі є конструктор, який приймає long
аргумент. Ви можете проаналізувати це за допомогою DateFormat
класу:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
, java.util.Calendar
і java.text.SimpleDateFormat
тепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Як що до цього?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
Що ви маєте на увазі часові позначки? Якщо ви маєте на увазі мілісекунди після епохи Unix:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Якщо ви хочете фактичний об’єкт java.sql.Timestamp:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Оновимо цю сторінку, показавши код за допомогою фреймворку java.time, вбудованого в Java 8 та новіших версій.
Ці нові класи натхненні Joda-Time , визначеним JSR 310 , і розширеним проектом ThreeTen-Extra . Вони витісняють сумно сумнівні старі класи дат у часі з ранніми версіями Java.
У java.time Instant
- момент на часовій шкалі в UTC. A ZonedDateTime
- це миттєвий режим, адаптований у часовий пояс ( ZoneId
).
Тут важливий часовий пояс. Дата September 23, 2007
не може бути переведена на момент на шкалі часу без застосування часового поясу. Вважайте, що новий день світиться раніше в Парижі, ніж в Монреалі, де він ще "вчора".
Також java.sql.Timetamp представляє як дату, так і час дня. Тому ми мусимо ввести час дня, щоб пройти разом із датою. Ми припускаємо, що ви хочете, щоб перший момент дня був як час доби. Зауважте, що це не завжди час 00:00:00.0
через літній час та, можливо, інші аномалії.
Зауважте, що на відміну від старого класу java.util.Date та на відміну від Joda-Time, типи java.time мають роздільну здатність наносекунд, а не мілісекунд. Це відповідає роздільній здатності java.sql.Timestamp.
Зауважте, що java.sql.Timestamp має неприємну звичку неявно застосовувати поточний часовий пояс JVM за замовчуванням до його значення дати та часу під час генерування рядкового подання за його toString
методом. Тут ви бачите застосований мій America/Los_Angeles
часовий пояс. Навпаки, класи java.time є більш розумними, використовуючи стандартні формати ISO 8601 .
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
Скиньте до консолі.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
Коли бігають.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [Америка / Монреаль] = миттєво: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00.0
До речі, станом на JDBC 4.2 ви можете використовувати типи java.time безпосередньо. Не потрібно java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date
, Calendar
, і SimpleDateFormat
.
Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає необхідності в струнах, немає необхідності в java.sql.*
заняттях.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .
Ви також можете зробити наступне:
// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
Згідно API, конструктор, який би приймав рік, місяць тощо, застарілий. Натомість слід використовувати конструктор, який приймає довго. Ви можете використовувати реалізацію календаря, щоб побудувати потрібну дату та отримати доступ до часового представлення як довгий, наприклад, методом getTimeInMillis .
Для повноти також рішення з Joda-Time версії 2.5 та його DateTime
класом:
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
об’єкта застосується поточний часовий пояс JVM за замовчуванням . Це означає, що ваші результати залежать від різних комп’ютерів або конфігурації хост-ОС або налаштувань JVM. Для прогнозованих результатів передайте часовий пояс цьому DateTime
конструктору. Виберіть правильну назву часового поясу для свого наміру. Наприклад, DateTimeZone.forID( "America/Montreal" )
або DateTimeZone.UTC
.
DateTime
об’єкт за його мілісекунди з часу епохи. Замініть .toDate().getTime()
на .getMillis()
.
DateTimeZone.getDefault()
та передавши результат як необов'язковий аргумент. (До речі, про те Locale.getDefault()
саме питання щодо неоднозначності необов'язкових аргументів.)
Більш загальною відповіддю було б імпортувати java.util.Date
, тоді, коли вам потрібно встановити timestamp
рівну поточній даті, просто встановіть його рівним new Date()
.