Отметка времени Java - Как я могу создать отметку времени с датой 23.09.2007?

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


person pigouina    schedule 10.06.2009    source источник


Ответы (8)


Под 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);
person Adam Paynter    schedule 10.06.2009
comment
Нормальный формат даты ISO - гггг-ММ-дд, в остальном отлично! - person vidstige; 24.03.2014
comment
новая отметка времени (время); дает ошибку, что нет такого конструктора, который принимает длинное значение :( - person Bhanu Sharma; 14.05.2014
comment
@Bhanu Документы показывают, что это действительно длинное значение и, похоже, работает правильно: docs.oracle.com/javase/7/docs/api/java/sql/ - person Hazok; 16.12.2014
comment
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar, и java.text.SimpleDateFormat теперь являются устаревшими и заменены java.time классы, встроенные в Java 8 и новее . См. Руководство от Oracle. - person Basil Bourque; 25.01.2019

Что насчет этого?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
person pigouina    schedule 10.06.2009
comment
Временная метка timestamp = Timestamp.valueOf (2007-09-23 10: 10: 10.0); показывает, что метод valueOf не определен для типа Timestamp в jDK 7 - person Ashish Ratan; 19.02.2014
comment
новая отметка времени (время); дает ошибку, что нет такого конструктора, который принимает строковое значение :( - person Bhanu Sharma; 14.05.2014
comment
@Bhanu Конструктор берет время unix в миллисекундах. Используйте статический метод valueOf, если вы хотите получить метку времени из строки. - person Hazok; 16.12.2014
comment
Кажется, это лучший ответ на вопрос. - person Hazok; 16.12.2014
comment
Лучшим ответом является дата, которая устарела, поэтому ее использование является плохой практикой. Этот ответ лучше. Спасибо - person Alberici; 15.04.2016

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

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

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

Timestamp ts = new Timestamp(millis);
person Matthew Flaschen    schedule 10.06.2009
comment
НЕПРАВИЛЬНО и не компилируется! Ошибка компиляции: 09 - восьмеричное число, но 9 выходит за пределы допустимого диапазона. Логическая ошибка: месяц отсчитывается от 0, вы получите 23 ОКТЯБРЯ 2007 г. - person user85421; 10.06.2009
comment
Я не могу получить логическую ошибку, если она не компилируется. :) Серьезно, хорошие уловы, Карлос. Восьмеричный, который я ловил раньше, но все равно вставил неправильно. :( - person Matthew Flaschen; 10.06.2009
comment
На самом деле конструктор Timestamp лишен, скорее вы можете использовать метод Timestamp.valueOf () - person Shiva Komuravelly; 27.12.2012
comment
@ShivaKomuravelly не все конструкторы временных меток устарели и, по крайней мере, не занимают много миллисекунд, конструктор, который принимает дату в качестве аргумента, устарел - person no name; 13.03.2013
comment
И для этого есть константа (вместо month = 9): Calendar.SEPTEMBER - person Guillaume Husta; 16.05.2014

tl;dr

java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .atStartOfDay( 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.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.time фреймворк встроен в Java 8 и новее. Эти классы заменяют неудобные старые устаревшие классы даты и времени, такие как _ 14_, _ 15_, & _ 16_.

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

Чтобы узнать больше, см. Учебник Oracle . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310.

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

Где взять классы java.time?

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

person Basil Bourque    schedule 27.10.2015
comment
Интересно, как я могу получить OP или моды, чтобы пометить ваш ответ как правильный. Принятый ответ настолько устарел. - person sttaq; 25.01.2019
comment
Очень красиво, если не считать опечатки. asStartOfDay () должен быть atStartOfDay (). - person Tullochgorum; 20.12.2019
comment
@Tullochgorum Исправлено. Спасибо. К вашему сведению, в Stack Overflow вы можете сами вносить такие правки, если хотите. - person Basil Bourque; 20.12.2019

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

// 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());
person Alex    schedule 10.06.2009
comment
НЕПРАВИЛЬНО: попробуйте System.out.println результата! Вы получите что-то вроде: 2009-10-23 15: 26: 56.171 Месяц отсчитывается от 0, поэтому 9 - это октябрь! - person user85421; 10.06.2009
comment
Я знал, что одна из этих констант отсчитывается от нуля, спасибо. Сообщение обновлено. - person Alex; 10.06.2009
comment
Да, еще я поставил "непроверенный" :) - person Alex; 10.06.2009

Согласно API конструктор, который accept year, month и т. д. устарел. Вместо этого вы должны использовать конструктор, который принимает long. Для создания дату, которую вы хотите, и доступ к представлению времени как длинный, например, с помощью getTimeInMillis.

person Philipp    schedule 10.06.2009

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

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
person user152468    schedule 13.10.2014
comment
Хороший ответ, но вы упустили одну важную деталь: часовой пояс. Если вы опустите часовой пояс, текущий часовой пояс JVM по умолчанию применяется к объекту DateTime. Это означает, что ваши результаты будут отличаться на разных компьютерах, в зависимости от конфигурации ОС хоста или настроек JVM. Для получения предсказуемых результатов передайте часовой пояс этому DateTime конструктору. Выберите подходящее название часового пояса в соответствии с вашим намерением. Например, DateTimeZone.forID( "America/Montreal" ) или DateTimeZone.UTC. - person Basil Bourque; 13.10.2014
comment
Этот код можно было бы короче. Нет необходимости преобразовывать в java.util.Date, чтобы получить и передать миллисекунды с момента эпохи . Просто спросите у объекта DateTime миллисекунды с начала эпохи. Замените .toDate().getTime() на _3 _ . - person Basil Bourque; 13.10.2014
comment
@BasilBourque В зависимости от обстоятельств вы можете не учитывать часовой пояс, чтобы получить предсказуемые результаты. В вашем текущем часовом поясе может быть вполне разумный и предсказуемый результат. Зачем жестко кодировать часовой пояс или просить пользователей вручную установить часовой пояс, если на их компьютере уже установлен часовой пояс? Конечно, я был бы очень удивлен, если бы приложение на моем компьютере начало выводить даты, скорректированные по часовому поясу Америки / Монреаля. - person dan carter; 22.06.2016
comment
@dancarter Пропуск необязательного часового пояса приводит к путанице. Упущение вызывает двусмысленность: (а) намеревался ли программист полагаться на неявное значение по умолчанию или (б) программист не учел проблемы часового пояса (что слишком часто). Если вы действительно хотите использовать текущий часовой пояс JVM по умолчанию, заявите об этом явно, вызвав DateTimeZone.getDefault() и передав результат в качестве необязательного аргумента. (Между прочим, то же самое для Locale.getDefault(), такая же проблема из-за неоднозначности необязательных аргументов.) - person Basil Bourque; 22.06.2016

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

person CSquid    schedule 28.11.2012
comment
потому что ** Дата (строка); ** устарел - person Ashish Ratan; 19.02.2014