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



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

1308   8  

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.setObject
  • ResultSet.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

    Ничего не найдено.