Відповіді:
За 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.setObjectResultSet.getObjectJava.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().