ТЛ; Др
LocalDateTime.parse( // Parse as a date-time lacking time zone or offset-from-UTC.
"12/01/2014 05:30:15 PM" , // Define a formatting pattern to match input. Case-sensitive formatting code. Use `h` lowercase for 12-hour clock, 0-12. Use uppercase `H` for 24-hour clock, 0-23.
DateTimeFormatter.ofPattern("MM/dd/uuuu hh:mm:ss a" , Locale.US)
).format( // Generate a String in specific format. Generally better to let java.time localize automatically.
DateTimeFormatter.ofPattern("MM/dd/uuuu hh:mm:ss a" , Locale.US)
)
java.time
Современный подход использует java.time классы, которые вытеснили неприятные старые классы времени.
Получить текущий момент в UTC. Класс Instant
представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now() ;
Чтобы увидеть тот же самый момент, через призму времени, на стену часов, используемых людьми определенного региона (зоны), применить ZoneId
получить ZonedDateTime
.
Указать proper time zone name в формате continent/region
, такие как America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте аббревиатуру 3-4 буквы, такую как EST
или IST
, так как они не настоящие часовые пояса, не стандартизированные, и даже не уникальные (!).
ZoneId z = ZoneId.of("Africa/Tunis") ;
ZonedDateTime zdt = instant.atZone(z) ;
Для генерации строки в стандартном формате ISO 8601 на любой из них, вызовите toString
. Классы java.time по умолчанию используют стандартные форматы, когда строят/генерируют строки. Поэтому нет необходимости указывать шаблон форматирования.
Если вы хотите использовать другие форматы, используйте классы DateTimeFormatter
или DateTimeFormatterBuilder
. Вы можете указать шаблон форматирования, но проще разрешить java.time автоматически локализовать.
Для локализации, указать:
FormatStyle
, чтобы определить, как долго или сокращенно должна быть строка.
Locale
, чтобы определить (а) человеческий язык для перевода имени дня, названия месяца и т. Д., И (b) культурные нормы, решающие вопросы аббревиатуры, капитализации, пунктуации, разделители и т. Д.
Пример:
Locale l = Locale.FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(l);
String output = zdt.format(f);
MERCREDI 14 Février 2018 à 00:59:07 Heure Normale d'Europe Центральный
Или Locale.US
& FormatStyle.SHORT
.
2/14/18, 1:01 утра
Ваш пользовательский формат для ввода является:
String input = "12/01/2014 05:30:15 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM/dd/uuuu hh:mm:ss a" , Locale.US) ;
, что входная строка отсутствует какой-либо индикатор часового пояса или offset- из-UTC. Таким образом, это не a moment, не определенный момент на шкале времени. Он представляет собой смутное представление о потенциале моментов в диапазоне около 26-27 часов. Таким образом, мы анализируем этот ввод в LocalDateTime
, лишенном какой-либо концепции зоны/смещения.
LocalDateTime ldt = LocalDateTime.parse(input , f) ;
ldt.toString(): 2014-12-01T17: 30: 15
Сформировать строку в этом формате.
String output = ldt.format(f) ;
12/01/2014 05:30:15 PM
Как объяснено другие, коды форматирования чувствительны к регистру. Если вы хотите 24-часовое время, используйте прописные буквы H
. Для 12-часового использования используйте строчные буквы h
.
Отметьте, что коды форматирования: java.time близки к наследию SimpleDateFormat
, но не совсем то же самое. Изучите документацию и найдите «Переполнение стека» для многих примеров.
При обмене значениями даты и времени в тексте придерживайтесь стандартных форматов ISO 8601.
О java.time
java.time каркас встроен в Java 8 и более поздних версий.Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
Использование JDBC driver соответствует JDBC 4.2 или более поздней версии, вы можете обменять java.time объекты непосредственно с базой данных. Нет необходимости в строках или классах java.sql. *.
Где получить классы java.time?
- Java SE 8, Java SE 9, а затем
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android реализаций пачке классов java.time.
- Для более ранних Android, проект ThreeTenABP адаптируется ThreeTen-Backport (упомянутый выше). См. How to use ThreeTenABP….
ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
Если вы замените hh на HH в iFormat, тогда время 05:30:15 будет считаться 24-часовым часом, а PM игнорируется ... – beny23
@agarwal_achhnera делает это [это] (http: // stackoverflow. com/questions/17341214/difference-between-java-hhmm-and-hhmm-on-simpledateformat) help –
Я не уверен, почему этот вопрос был отклонен. Возможно, иллюстратор может объяснить свои причины? Конечно, в коде есть ошибка, но это вопрос вопросов о stackoverflow. Ошибка приводит к вопросу, и наша коллективная мудрость помогает решить эту проблему. Per ardua ad astra. Возможно, этот вопрос показал недостаточную исследовательскую работу (что касается всех вопросов, или они будут решены до перехода на stackoverflow), но это не показало никаких исследований. Я голосую, потому что это полезный, ясный вопрос. –