ТЛ; др
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
Теперь мы можем разобрать его как a LocalDateTime, где «Local» означает отсутствие конкретной местности. На входе отсутствует информация о смещении от UTC или часовом поясе.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Если вам не важны ни время суток, ни часовой пояс, конвертируйте в формат LocalDate.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 01.01.2008
Первый момент дня
Если вместо этого вы хотите установить время дня на первый момент дня, используйте 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 , извлеките Instantобъект. Оба символа ZonedDateTimeи Instantбудут представлять один и тот же момент на шкале времени, но будут отображаться как два разных времени настенных часов .
An 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 . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в 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 (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Как использовать ThreeTenABP… .
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval, YearWeek, YearQuarter, и более .