8 ответов:
By
Timestamp, Я полагаю, вы имеете в видуjava.sql.Timestamp. Вы заметите, что этот класс имеет конструктор, который принимает
Как насчет этого?
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 ts = new Timestamp(millis);
tl; dr
java.sql.Timestamp.from ( LocalDate.of ( 2007 , 9 , 23 ) .asStartOfDay( ZoneId.of ( "America/Montreal" ) ) .toInstant() )java.время
давайте обновим эту страницу, показывая код с помощью java.время фреймворк, встроенный в Java 8 и более поздние версии.
эти новые классы вдохновлены Joda Времени, определено JSR 310 и продлен ThreeTen-Extra. Они вытесняют заведомо проблемные старые классы даты-времени в комплекте с ранними версиями Java.
In Ява.время
Instantэто момент на временной шкале в UTC. АZonedDateTime- это мгновение, настроенное на часовой пояс (ZoneId).часовой пояс имеет решающее значение здесь. Дата
September 23, 2007невозможно перевести в момент на временной шкале без применения часового пояса. Считайте, что новый день в Париже наступает раньше, чем в Монреале, где он все еще "вчера".кроме того, java.язык SQL.Метка времени представляет собой дату и время суток. Поэтому мы должны ввести время дня, чтобы идти вместе с дата. Мы предполагаем, что вы хотите, чтобы первый момент дня был временем суток. Обратите внимание, что это не всегда времени
00:00:00.0из-за летнего времени и, возможно, других аномалий.обратите внимание, что в отличие от старой Явы.утиль.Класс даты, и в отличие от Joda-Time, java.времени имеют разрешение наносекунд, а не миллисекунды. Это соответствует разрешению java.язык SQL.Отметка времени.
обратите внимание, что java.язык SQL.Метка времени имеет неприятную привычку неявно применять текущий часовой пояс JVM по умолчанию для его значения даты-времени при создании строкового представления через его
toStringметод. Вот вы видите мойAmerica/Los_Angelesчасовой пояс применяется. В отличие от Явы.классы времени более вменяемы, используя стандарт ISO 8601 форматы.LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ; ZoneId z = ZoneId.of ( "America/Montreal" ) ; ZonedDateTime zdt = d.asStartOfDay( 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[America/Montreal] = instant: 2007-09-23T04:00: 00Z = ts: 2007-09-22 21:00:00.0
кстати, начиная с JDBC 4.2, вы можете использовать java.времени напрямую. Нет необходимости
java.sql.Timestamp.
PreparedStatement.setObjectResultSet.getObject
по словам API конструктор, который будет принимать год, месяц и так далее является устаревшим. Вместо этого вы должны использовать конструктор, который принимает долго. Вы могли бы использовать календарь реализация, чтобы построить дату, которую вы хотите, и получить доступ к представлению времени как долго, например, с getTimeInMillis метод.
вы также можете сделать следующее:
// 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());
для полноты картины, также решение с Joda Времени версия 2.5 и
DateTimeкласс:new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
более общим ответом было бы импортировать
java.util.Date, тогда, когда вам нужно установитьtimestampравна текущей дате, просто установите его равнымnew Date().
Comments