tl; dr
Современный подход использует java.time классы.
Instant.now() // Capture current moment in UTC.
.truncatedTo( ChronoUnit.SECONDS ) // Lop off any fractional second.
.plus( 8 , ChronoUnit.HOURS ) // Add eight hours.
.atZone( ZoneId.of( "America/Montreal" ) ) // Adjust from UTC to the wall-clock time used by the people of a certain region (a time zone). Returns a `ZonedDateTime` object.
.format( // Generate a `String` object representing textually the value of the `ZonedDateTime` object.
DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
.withLocale( Locale.US ) // Specify a `Locale` to determine the human language and cultural norms used in localizing the text being generated.
) // Returns a `String` object.
23/01/2017 15: 34: 56
java.time
К вашему сведению, старые Calendar
и Date
классы теперь устаревшие ,Подменяется классами java.time .Большая часть java.time перенесена на Java 6, Java 7 и Android (см. Ниже).
Instant
Захват текущего момента в UTC с классом Instant
,
Instant instantNow = Instant.now();
instant.toString (): 2017-01-23T12: 34: 56,789Z
Если вы хотите только целые секунды, без доли секунды, усечение.
Instant instant = instantNow.truncatedTo( ChronoUnit.SECONDS );
instant.toString (): 2017-01-23T12: 34: 56Z
Математика
Instant
класс может сделать математику, добавив количество времени.Укажите количество времени, которое нужно добавить с помощью перечисления ChronoUnit
, реализации TemporalUnit
.
instant = instant.plus( 8 , ChronoUnit.HOURS );
instant.toString (): 2017-01-23T20: 34: 56Z
ZonedDateTime
Чтобы увидеть тот же момент через объектив настенного времени определенного региона, примените ZoneId
, чтобы получить ZonedDateTime
.
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 3-4-буквенное сокращение, такое как EST
или IST
, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2017-01-23T15: 34: 56-05: 00 [Америка / Монреаль]
Создать строку
Вы можете сгенерировать строку в желаемом формате, указав шаблон форматирования в объекте DateTimeFormatter
.
Обратите внимание, что регистр имеет значение в буквах шаблона форматирования.Код вопроса содержал hh
, что соответствует 12-часовому времени, в то время как HH
в верхнем регистре соответствует 24-часовому времени (0-23) как в java.time.DateTimeFormatter
, так и в устаревшем java.text.SimpleDateFormat
.
Коды форматирования в java.time похожи на коды в прежнем SimpleDateFormat
, но не совсем такие же.Внимательно изучите класс док.Здесь HH
работает одинаково.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ).withLocale( Locale.US );
String output = zdt.format( f );
Автоматическая локализация
Вместо того, чтобы жестко кодировать шаблон форматирования, рассмотрите возможность полной локализации java.time .генерация текста String
путем вызова DateTimeFormatter.ofLocalizedDateTime
.
И, кстати, помните, что часовой пояс и Locale
не имеют ничего делатьдруг с другом;ортогональные вопросы.Один о содержание , значение (время настенные часы).Другой - это представление , определяющее человеческий язык и культурные нормы, используемые при представлении этого значения пользователю.
Instant instant = Instant.parse( "2017-01-23T12:34:56Z" );
ZoneId z = ZoneId.of( "Pacific/Auckland" ); // Notice that time zone is unrelated to the `Locale` used in localizing.
ZonedDateTime zdt = instant.atZone( z );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL )
.withLocale( Locale.CANADA_FRENCH ); // The locale determines human language and cultural norms used in generating the text representing this date-time object.
String output = zdt.format( f );
instant.toString (): 2017-01-23T12: 34: 56Z
zdt.toString (): 2017-01-24T01: 34: 56 + 13: 00 [Pacific / Auckland]
выход: mardi 24 января 2017 à 01:34:56 heure avancée de la Nouvelle-Zelande
О java.time
java.time Framework встроен в 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?
Joda-Time
Обновление: Joda-Time проект теперь находится в режиме обслуживания , с командой, советующей перейти на классы java.time .
Joda-Время значительно облегчает работу такого типа.
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;
DateTime later = DateTime.now().plusHours( 8 );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd/MM/yyyy HH:mm:ss" );
String laterAsText = formatter.print( later );
System.out.println( "laterAsText: " + laterAsText );
При запуске ...
laterAsText: 19/12/2013 02:50:18
Обратите внимание, что в этом синтаксисе используется часовой пояс по умолчанию .Лучше всего использовать явный экземпляр DateTimeZone.