Як отримати поточну мітку часу у строковому форматі на Java? "Yyyy.MM.dd.HH.mm.ss"


174

Як отримати позначку часу у строковому форматі на Java? "yyyy.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

Це те, що у мене є, але для Timestamp () потрібні параметри ...


readyStatement.setTimestamp (1, нова Timestamp (System.currentTimeMillis ()));
Раджат

Яку помилку ви отримуєте?
Роберт Колумбія

FYI, жахливі старі класи дату, такі як SimpleDateFormatі java.sql.Timestampтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

Відповіді:


202

Замініть

new Timestamp();

з

new java.util.Date()

тому що немає конструктора за замовчуванням для Timestamp, або ви можете це зробити методом:

new Timestamp(System.currentTimeMillis());

5
FYI, жахливі старі класи дату, такі як java.util.Dateі java.sql.Timestampтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

160

Використовуйте java.util.Dateклас замість Timestamp.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

Це дозволить отримати поточну дату у вказаному форматі.


5
Це допомогло мені, і я змінив деякі зміни, тому мені не потрібно імпортувати new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Піні Чейні

Краще new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Зон

36

тл; д-р

Використовуйте лише сучасні класи java.time . Ніколи не використовуйте жахливі застарілі класи , такі як SimpleDateFormat, Dateабо java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

Або скористайтеся поточним часовим поясом за замовчуванням JVM .

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time та JDBC 4.2

Сучасний підхід використовує класи java.time, як видно вище.

Якщо ваш драйвер JDBC відповідає JDBC 4.2 , ви можете безпосередньо обмінюватися об’єктами java.time з базою даних. Використовуйте PreparedStatement::setObjectі ResultSet::getObject.

Використовуйте java.sql лише для драйверів до JDBC 4.2

Якщо ваш драйвер JDBC ще не відповідає JDBC 4.2 для підтримки типів java.time , ви повинні повернутися до використання класів java.sql.

Зберігання даних.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

Отримання даних.

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

Такі типи java.sql, як, наприклад java.sql.Timestamp, слід використовувати лише для передачі в базу даних та поза нею. Негайно перетворити на типи java.time в Java 8 та новіших версіях.

java.time.Instant

java.sql.TimestampКарти до java.time.Instant, момент на шкалі часу в форматі UTC. Зверніть увагу на новий метод перетворення, toInstantдоданий до старого класу.

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

Часовий пояс

Застосуйте потрібний / очікуваний часовий пояс ( ZoneId), щоб отримати а ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Форматизовані рядки

Використовуйте a DateTimeFormatterдля створення вашого рядка. Коди шаблонів схожі на ті, java.text.SimpleDateFormatале не зовсім, тому уважно читайте документ.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Цей конкретний формат неоднозначний щодо його точного значення, оскільки у ньому відсутні будь-які вказівки на зміщення з-за UTC або часового поясу.

ISO 8601

Якщо ви маєте щось з цього приводу, пропоную вам скористатися стандартними форматами ISO 8601 , а не прокручувати свій власний. Стандартний формат досить схожий на ваш. Наприклад:
2016-02-20T03:26:32+05:30.

Класи java.time використовують стандартні формати за замовчуванням, тому не потрібно вказувати шаблон. ZonedDateTimeКлас розширює стандартний формат шляхом додавання імені тимчасової зони (мудра поліпшення).

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

Перетворити на java.sql

Ви можете конвертувати з java.time назад в java.sql.Timestamp. Витяг Instantз ZonedDateTime.

До старих класів додано нові методи для полегшення перетворення в / з класів java.time.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Таблиця типів дат і часу на Java (як застаріла, так і сучасна) та в стандартних SQL


Про java.time

Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

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

Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .

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

Де отримати класи java.time?

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є доказом можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


То який правильний спосіб отримати поточну марку часу настінного годинника у форматі "yyyy.MM.dd.HH.mm.ss"? Без явного введення жорстко закодованого рядка мого локального часового поясу? Ось, про що запитував стартер теми, і я не зміг знайти його у вашій відповіді ...
t7ko

@ t7ko Я додав рядок прикладу коду до розділу tl; dr, показуючи, як явно запитати поточний часовий пояс JVM за замовчуванням. Виклик "зараз ()" без будь-яких аргументів робить те саме, але не зрозуміло, чи ви мали намір використовувати за замовчуванням або якщо ви були неосвічені або забули про вирішальну проблему часового поясу.
Василь Бурк

32

Ви можете використовувати java.util.Date замість Timestamp:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

6

Більш підходящим підходом є визначення області локалізації як параметра в конструкторі. У наведеному нижче прикладі використовується місцевий регіон США. Форматування дати чутливе до мови та використовує Locale для адаптації інформації стосовно звичаїв та конвенцій регіону користувача Locale (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());

1
Немає такого поняття, як "Локальна зона". Я підозрюю, що ваш заплутаний Localeі часовий пояс не пов'язані між собою. Localeконтролює культурні норми форматування та людську мову, що використовується для назви місяця / дня. Часовий пояс налаштовує подання часу та часу відповідно до часу настінного годинника для певного регіону . У випадку з цим запитанням Місцевий пошук не має значення, оскільки не існує питань форматування, з якими слід застосовувати культурні норми, а також не існує назви місяця / дня, щоб локалізувати якусь конкретну людську мову.
Василь Бурк

@BasilBourque Дякую за ваш внесок. Я оновив відповідь, щоб бути більш чітким
користувач3144836

4

Можна скористатися наступним

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

Сподіваюсь, це допоможе. Просто моя пропозиція, а не бали за винагороду.


У ньому немає запитуваного строкового формату. Також я боюся, що єдине, що додається до пари подібних відповідей, - це зайве ускладнення…
Оле VV

4

Використовуйте сучасні java.timeкласи, якщо ви використовуєте java 8 або новіші.

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

Відповідь Василя Бурка досить хороша. Але це занадто довго. Багато людей не мали б терпіння прочитати це. Топ-3 відповіді занадто давні і можуть вводити в оману нову бджолу на Яві. Тому я надаю цю коротку та сучасну відповідь для нових майбутніх розробників. Сподіваюся, що ця відповідь може зменшити використання жахливого SimpleDateFormat.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.