Java Timestamp - Как мне создать Timestamp с датой 23/09/2007? - PullRequest
93 голосов
/ 10 июня 2009

Как я могу создать метку времени с датой 23/09/2007?

Ответы [ 8 ]

145 голосов
/ 10 июня 2009

Под 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);
109 голосов
/ 10 июня 2009

Как насчет этого?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
17 голосов
/ 10 июня 2009

Что вы имеете в виду отметку времени? Если вы имеете в виду миллисекунды с эпохи Unix:

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();

Если вам нужен реальный объект java.sql.Timestamp:

Timestamp ts = new Timestamp(millis);
10 голосов
/ 27 октября 2015

ТЛ; др

java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .asStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

java.time

Давайте обновим эту страницу, показывая код с использованием java.time фреймворка, встроенного в Java 8 и более поздние версии.

Эти новые классы основаны на Joda-Time , определенном JSR 310 и расширенном проектом ThreeTen-Extra . Они вытесняют печально известные старые классы даты и времени, связанные с ранними версиями Java.

В java.time, Instant - это момент времени на UTC. ZonedDateTime - это мгновенное значение, настроенное на часовой пояс (ZoneId).

Здесь важен часовой пояс. Дата September 23, 2007 не может быть переведена на определенный момент времени без применения часового пояса. Учтите, что в Париже новый день наступает раньше, чем в Монреале, где он все еще «вчера».

Кроме того, java.sql.Timestamp представляет дату и время суток. Таким образом, мы должны ввести время суток, чтобы согласовать дату. Мы предполагаем, что вы хотите, чтобы первое время дня было временем суток. Обратите внимание, что это не всегда время 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.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 [Америка / Монреаль] = мгновенный: 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.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые унаследованные классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

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

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

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

Где получить классы java.time?

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

4 голосов
/ 10 июня 2009

Вы также можете сделать следующее:

// 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());
4 голосов
/ 10 июня 2009

В соответствии с API конструктор, который будет принимать год, месяц и т. Д., Считается устаревшим. Вместо этого вы должны использовать конструктор, который принимает длинные. Вы можете использовать реализацию Calendar , чтобы построить желаемую дату и получить представление времени как long, например, с помощью метода getTimeInMillis .

1 голос
/ 13 октября 2014

Для полноты картины также имеется решение с Joda-Time версия 2.5 и DateTime класс:

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
0 голосов
/ 28 ноября 2012

Более общим ответом будет импорт java.util.Date, тогда, когда вам нужно установить timestamp равным текущей дате, просто установите его равным new Date().

...