Временная метка Java. Как создать временную метку с датой 23/09/2007?

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

Ответ 1

Под 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);

Ответ 2

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

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");

Ответ 3

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

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

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

Timestamp ts = new Timestamp(millis);

Ответ 4

ТЛ; др

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 [America/Montreal] = мгновенное: 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?

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

Ответ 5

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

Ответ 6

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

// 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());

Ответ 7

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

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())

Ответ 8

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