Как я могу создать метку времени с датой 23.09.2007?
Ответы:
По 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.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.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 Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - 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 конструктор, принимающий год, месяц и т. Д., Устарел. Вместо этого вы должны использовать конструктор, который принимает long. Вы можете использовать реализацию Calendar для создания нужной даты и доступа к представлению времени в виде длинного числа, например, с помощью метода getTimeInMillis .
DateTime
объекту применяется текущий часовой пояс JVM по умолчанию . Это означает, что ваши результаты будут отличаться для разных компьютеров или конфигурации ОС хоста или настроек JVM. Для получения предсказуемых результатов передайте часовой пояс этому DateTime
конструктору. Выберите подходящее название часового пояса для вашего намерения. Например, DateTimeZone.forID( "America/Montreal" )
или DateTimeZone.UTC
.
DateTime
объект в миллисекундах с начала эпохи. Заменить .toDate().getTime()
на .getMillis()
.
DateTimeZone.getDefault()
и передав результат в качестве необязательного аргумента. (Между прочим, то Locale.getDefault()
же самое для , такая же проблема с двусмысленностью необязательных аргументов.)
Более общий ответ - импортировать java.util.Date
, тогда, когда вам нужно установить timestamp
равное текущей дате, просто установите его равным new Date()
.