Как получить текущую метку времени в строковом формате в 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 () требует параметров ...

user3388884
источник
prepareStatement.setTimestamp (1, новая отметка времени (System.currentTimeMillis ()));
Раджат
Какую ошибку вы получаете?
Роберт Колумбия
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как SimpleDateFormatи java.sql.Timestampтеперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и более поздние версии . Смотрите Учебник по Oracle .
Василий Бурк

Ответы:

202

замещать

new Timestamp();

с участием

new java.util.Date()

потому что нет конструктора по умолчанию для Timestamp, или вы можете сделать это с помощью метода:

new Timestamp(System.currentTimeMillis());
Джигар Джоши
источник
5
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Dateи java.sql.Timestampтеперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и более поздние версии . Смотрите Учебник по Oracle .
Василий Бурк
160

Используйте java.util.Dateкласс вместо метки времени.

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

Вы получите текущую дату в указанном формате.

dimoniy
источник
5
Это помогло мне, и я сделал некоторые изменения, поэтому мне не нужно импортировать new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni
Лучше new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon
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 );

Форматированные строки

Используйте 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 Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

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

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

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

Базилик Бурк
источник
Так что же является правильным способом получить текущую отметку времени настенных часов в формате "гггг.ММ.Дд.ЧЧ.мм.сс"? Без явного указания жестко запрограммированной строки моего местного часового пояса? Это то, что спрашивал
автор
@ t7ko Я добавил строку примера кода в раздел tl; dr, показывающую, как явно запросить текущий часовой пояс JVM по умолчанию. Вызов `now () 'без каких-либо аргументов делает то же самое, но неясно, если вы намеревались использовать значение по умолчанию или если вы не знали или забыли о критической проблеме часового пояса.
Василий Бурк
32

Вы можете использовать java.util.Date вместо Timestamp:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
Kakarot
источник
6

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

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());
user3144836
источник
1
Нет такой вещи, как «Locale Zone». Я подозреваю, что вы сбиваете с толку Localeи часовой пояс, которые не связаны. Localeконтролирует культурные нормы форматирования и человеческий язык, используемый для названия месяца / дня. Часовой пояс регулирует дату-представление времени , чтобы соответствовать каким - нибудь областям времени на стену часов . В случае с этим Вопросом, Локаль не имеет значения, так как нет проблем с форматированием, с помощью которых можно применять культурные нормы, а также нет названий месяцев / дней для локализации на какой-либо конкретный человеческий язык.
Базилик Бурк
@BasilBourque Спасибо за ваш вклад. Я обновил ответ, чтобы быть более явным
user3144836
4

Вы можете использовать следующее

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

Result : 1539594988651

Надеюсь, это поможет. Просто мое предложение, а не за бонусные баллы.

Феникс
источник
У него нет запрошенного формата строки. Кроме того, я боюсь, что единственное, что он добавляет к паре подобных ответов, - это ненужные осложнения ...
Оле В.В.
4

Используйте современные java.timeклассы, если вы используете Java 8 или новее.

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

Ответ Бэзила Бурка довольно хорош. Но это слишком долго. Многие люди не будут терпеливо читать это. Лучшие 3 ответа слишком стары и могут ввести в заблуждение новичка Java. Так что я предоставляю этот короткий и современный ответ для новых разработчиков. Надеюсь, что этот ответ может уменьшить использование ужасных SimpleDateFormat.

gzc
источник