tl; dr
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 [Eropa / Paris]
Untuk menghasilkan String dalam format yang Anda inginkan, berikan file 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
Detail
Jawaban Lain benar, tetapi gunakan kelas tanggal-waktu lama yang sekarang ketinggalan zaman oleh kerangka java.time.
java.time
Framework java.time dibangun di Java 8 dan yang lebih baru. Sebagian besar fungsionalitas java.time di-back-port ke Java 6 & 7 ( ThreeTen-Backport ) dan selanjutnya diadaptasi ke Android ( ThreeTenABP ).
Pertama, ubah string masukan agar sesuai dengan versi kanonik format ISO 8601. Format ISO 8601 standar digunakan secara default di kelas java.time untuk parsing / menghasilkan string yang mewakili nilai tanggal-waktu. Kita perlu mengganti SPASI di tengah dengan a T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
Sekarang kita dapat menguraikannya sebagai LocalDateTime
, di mana "Lokal" berarti tidak ada lokalitas tertentu. Masukan tidak memiliki informasi offset-from-UTC atau zona waktu.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 01-01-2008T13: 15.00
Jika Anda tidak peduli dengan waktu atau zona waktu, maka ubahlah menjadi LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 2008-01-01
Momen Pertama Hari Ini
Jika sebaliknya Anda ingin waktu hari disetel ke momen pertama hari itu, gunakan ZonedDateTime
kelas, lalu konversikan ke LocalDate
objek untuk memanggil atStartOfDay
metodenya. Sadarilah bahwa momen pertama mungkin bukan waktu 00:00:00
karena Daylight Saving Time atau mungkin anomali lainnya.
Zona waktu sangat penting karena untuk waktu tertentu, tanggal bervariasi di seluruh dunia menurut zona. Misalnya, beberapa saat setelah tengah malam di Paris adalah hari baru bagi warga Paris tetapi masih “kemarin” di Montréal bagi warga Kanada.
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 [Amerika / Montreal]
UTC
Untuk melihat momen itu melalui lensa zona waktu UTC , ekstrak sebuah Instant
objek. Baik ZonedDateTime
dan Instant
akan mewakili momen yang sama di garis waktu tetapi muncul sebagai dua waktu jam dinding yang berbeda .
An Instant
adalah kelas blok penyusun dasar di java.time, selalu dalam UTC menurut definisi. Gunakan kelas ini sesering mungkin, karena Anda biasanya harus melakukan logika bisnis, penyimpanan data, dan pertukaran data dalam UTC.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 01-01-2008T05: 00: 00Z
Kami melihat jam 5 pagi daripada pukul tengah malam. Dalam format standar, Z
di akhir adalah kependekan dari Zulu
dan berarti “UTC”.
Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date
, Calendar
, & SimpleDateFormat
.
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .
Anda dapat bertukar objek java.time langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu java.sql.*
kelas.
Di mana mendapatkan kelas java.time?
- Java SE 8 , Java SE 9 , dan yang lebih baru
- Bawaan.
- Bagian dari Java API standar dengan implementasi yang dibundel.
- Java 9 menambahkan beberapa fitur dan perbaikan kecil.
- Java SE 6 dan Java SE 7
- Sebagian besar fungsionalitas java.time di-back-port ke Java 6 & 7 di ThreeTen-Backport .
- Android
- Versi implementasi Android bundle kelas java.time yang lebih baru.
- Untuk Android sebelumnya (<26), yang ThreeTenABP proyek menyesuaikan ThreeTen-backport (disebutkan di atas). Lihat Cara menggunakan ThreeTenABP… .
Proyek ThreeTen-Extra memperluas java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan java.time di masa mendatang. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval
, YearWeek
, YearQuarter
, dan lebih .