ТЛ; др
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00: 00 + 01: 00 [Европа / Париж]
Чтобы сгенерировать строку в желаемом формате, передайте DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00: 00: 00
Подробнее
Другие ответы верны, но используют старые классы даты и времени, теперь устаревшие с помощью инфраструктуры java.time.
java.time
Среда java.time встроена в Java 8 и более поздние версии. Большая часть функциональности java.time перенесена в Java 6 & 7 ( ThreeTen-Backport ) и дополнительно адаптирована для Android ( ThreeTenABP ).
Сначала измените строку ввода, чтобы она соответствовала канонической версии формата ISO 8601. Стандартные форматы ISO 8601 используются по умолчанию в классах java.time для анализа / генерации строк, представляющих значения даты и времени. Нам нужно заменить это пространство в середине на T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
Теперь мы можем разобрать его как LocalDateTime
, где «Местный» означает отсутствие определенной местности. На входе отсутствует смещение от UTC или информация о часовом поясе.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Если вас не заботит ни время суток, ни часовой пояс, то конвертируйте в LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 2008-01-01
Первый момент дня
Если вместо этого вы хотите установить время дня в первый момент дня, используйте класс ZonedDateTime
, затем преобразуйте его в объект LocalDate
для вызова его atStartOfDay
метод. Помните, что первым моментом может быть не время 00:00:00
из-за перехода на летнее время или из-за других аномалий.
Часовой пояс имеет решающее значение, потому что в любой данный момент дата меняется по всему миру в зависимости от зоны. Например, несколько минут после полуночи в Париже - новый день для парижан, но для канадцев «вчера» в Монреале по-прежнему.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [Америка / Монреаль]
UTC
Чтобы увидеть этот момент через объектив часового пояса UTC , извлеките объект Instant
. И ZonedDateTime
, и Instant
будут представлять один и тот же момент на временной шкале, но будут отображаться в виде двух разных настенных часов .
Instant
- это базовый класс строительных блоков в java.time, всегда в UTC по определению. Используйте этот класс часто, как вы обычно делаете бизнес-логику, хранение данных и обмен данными в UTC.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 2008-01-01T05: 00: 00Z
Мы видим 5 утра, а не полночь. В стандартном формате Z
в конце сокращенно для Zulu
и означает «UTC».
О 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
и more .