ТЛ; др
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
, и более .