Т.Л., д-р
LocalDateTime.parse( // Parse string as value without time zone.
"2017-01-23 12:34 PM" ,
DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a")
).atZone(ZoneId.of("America/Montreal")) // Assign time zone.
.toString() // Generate string: 2017-01-23T17:34:00Z
.replace("T" , " ") // Substitute SPACE for 'T' in middle.
.replace("Z" , " Z") // Insert SPACE before 'Z'.
Избегайте унаследованное даты и время занятия
других ответы использовать проблемные старые классы даты и время (Date
, Calendar
и т.д.), теперь наследство, вытесняется java.time.
LocalDateTime
У меня есть строка в шаблоне YYYY-MM-ДД ЧЧ: ММ Такой входной строкой
испытывает недостаток каких-либо признаков офсетной из-UTC или часового пояса. Поэтому мы анализируем как LocalDateTime
.
Определите шаблон форматирования, соответствующий вашему вводу с объектом DateTimeFormatter
.
String input = "2017-01-23 12:34 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a");
LocalDateTime ldt = LocalDateTime.parse(input , f);
ldt.toString(): 2017-01-23T12: 34
Обратите внимание, что LocalDateTime
является не конкретный момент, лишь смутное представление о диапазоне возможных моментов , Например, через несколько минут после полуночи в Париже Франция все еще «вчера» в Монреале, Канада. Таким образом, без контекста часового пояса, такого как Europe/Paris
или America/Montreal
, просто сказать «через несколько минут после полуночи» не имеет смысла.
ZoneId
и я могу получить объект времени зоны отдельно, в которой выше строка представляет собой дату.
Часовой пояс представлен классом ZoneId
.
Указать proper time zone name в формате continent/region
, такие как America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте аббревиатуру 3-4 буквы, такую как EST
или IST
, так как они не настоящие часовые пояса, не стандартизированные, и даже не уникальные (!).
ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime
Нанести ZoneId
получить ZonedDateTime
, который действительно является точка на временной шкале, в определенный момент в истории.
ZonedDateTime zdt = ldt.atZone(z);
zdt.toString(): 2017-01-23T12: 34-05: 00 [Америка/Монреаль]
Instant
Я хочу, чтобы преобразовать это ниже формат. YYYY-MM-дд чч: мм: сс Z
Во-первых, известно, что Z
буквенный символ является аббревиатурой Zulu
и средства UTC. Другими словами, offset-from-UTC с нулевыми часами, +00:00
.
Instant
класса представляет момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).
Вы можете извлечь объект Instant
из ZonedDateTime
.
Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC.
Для генерации строки в стандартном формате ISO 8601, такие как 2017-01-22T18:21:13.354Z
, вызовите toString
. Стандартный формат не имеет пробелов, использует T
для разделения даты года-месяца с минуты-минуты и добавляет Z
канонически для смещения нуля.
String output = instant.toString();
instant.toString(): 2017-01-23T17: 34: 00Z
я настоятельно рекомендуется использовать стандартные форматы когда это возможно. Если вы настаиваете на использовании пробелов, как в указанном желаемом формате, либо определите свой собственный шаблон форматирования в объекте DateTimeFormatter
, либо просто выполните строчную манипуляцию на выходе Instant::toString
.
String output = instant.toString()
.replace("T" , " ") // Substitute SPACE for T.
.replace("Z" , " Z"); // Insert SPACE before Z.
выход: 2017-01-23 17:34:00 Z
Попробуйте code live at IdeOne.com.
О java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
Где получить классы java.time?
- Java SE 8 и SE 9, а затем
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
- Android
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
http://joda-time.sourceforge.net/ делает все манипуляции с датами в java намного проще – NimChimpsky
@ Emil, я узнал эту функцию после того, как вы сказали :), спасибо. – John
FYI, проект [Joda-Time] (http://www.joda.org/joda-time/) теперь находится в [режиме обслуживания] (https://en.wikipedia.org/wiki/Maintenance_mode), с команда, предлагающая перейти на классы [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). –