тл; д-р
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 ()… 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
Щоб побачити цей момент через об'єктив часового поясу 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 . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*
заняттях.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є доказом можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .