Saya memiliki objek Java Date yang berisi informasi tanggal dan waktu. Saya ingin menulis metode yang memotong informasi waktu, memotong jam-menit-detik, jadi saya hanya punya tanggal tersisa.
Contoh masukan:
2008-01-01 13:15:00
Output yang diharapkan:
2008-01-01 00:00:00
Apakah Anda punya tip? Saya mencoba melakukan sesuatu seperti ini:
(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)
tapi saya mengalami masalah dengan zona waktu.
java.util.Calendar
sekarang sudah lama , digantikan oleh kelas java.time . Lihat Tutorial oleh Oracle .Pernahkah Anda melihat metode pemotongan DateUtils di Apache Commons Lang?
akan menghapus elemen waktu.
sumber
Pernahkah Anda melihat Joda ? Ini adalah cara yang jauh lebih mudah dan lebih intuitif untuk bekerja dengan tanggal dan waktu. Misalnya Anda dapat mengonversi secara mudah antara objek (katakanlah) LocalDateTime dan LocalDate .
misalnya (untuk menggambarkan API)
Selain itu, ini memecahkan beberapa masalah keamanan thread dengan format tanggal / waktu dan sangat disarankan untuk menangani masalah tanggal / waktu di Java.
sumber
Hanya pembaruan cepat sehubungan dengan kelas java.time sekarang dibangun di Java 8 dan yang lebih baru.
LocalDateTime
memilikitruncatedTo
metode yang secara efektif membahas apa yang Anda bicarakan di sini:Ini akan mengungkapkan waktu saat ini menjadi menit saja:
Anda dapat menggunakan
ChronoUnit
(atau aTemporalUnit
) yang lebih kecil dari DAYS untuk menjalankan pemotongan (karena pemotongan hanya diterapkan ke bagian waktu LocalDateTime, bukan ke bagian tanggal).sumber
sumber
Dengan Joda Anda bisa dengan mudah mendapatkan tanggal yang diharapkan.
Pada versi 2.7 (mungkin karena beberapa versi sebelumnya lebih besar dari 2.2), sebagai catatan komentator,
toDateMidnight
sudah usang atau dinamai dengan tepatwithTimeAtStartOfDay()
, membuatbisa jadi.
Manfaat ditambahkan dari API yang jauh lebih baik.
Dengan versi yang lebih lama, Anda bisa melakukannya
sumber
withTimeAtStartOfDay
.toLocalDate
untuk mendapatkan objek yang bahkan tidak memiliki komponen waktu.Saya melakukan pemotongan dengan java8 API baru. Saya menghadapi satu hal aneh tetapi secara umum terpotong ...
sumber
Gunakan DateUtils dari Apache, dengan truncate, seperti ini:
sumber
Untuk cap waktu:
sumber
Dari java.util.Date JavaDocs:
dan dari java.sql.Date JavaDocs:
Jadi, pendekatan terbaik adalah menggunakan java.sql.Date jika Anda tidak membutuhkan bagian waktu
dan hasilnya adalah:
sumber
tl; dr
Untuk menghasilkan String dalam format yang Anda inginkan, berikan file
DateTimeFormatter
.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
.Sekarang kita dapat menguraikannya sebagai
LocalDateTime
, di mana "Lokal" berarti tidak ada lokalitas tertentu. Masukan tidak memiliki informasi offset-from-UTC atau zona waktu.Jika Anda tidak peduli dengan waktu atau zona waktu, maka ubahlah menjadi
LocalDate
.Momen Pertama Hari Ini
Jika sebaliknya Anda ingin waktu hari disetel ke momen pertama hari itu, gunakan
ZonedDateTime
kelas, lalu konversikan keLocalDate
objek untuk memanggilatStartOfDay
metodenya. Sadarilah bahwa momen pertama mungkin bukan waktu00: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.
UTC
Untuk melihat momen itu melalui lensa zona waktu UTC , ekstrak sebuah
Instant
objek. BaikZonedDateTime
danInstant
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.Kami melihat jam 5 pagi daripada pukul tengah malam. Dalam format standar,
Z
di akhir adalah kependekan dariZulu
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?
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 .sumber
Gunakan metode kelas Kalender
set()
untuk menyetel bidangHOUR_OF_DAY, MINUTE, SECOND
danMILLISECOND
ke nol.sumber
Pertanyaannya kontradiktif. Ini meminta tanggal tanpa waktu namun menampilkan contoh dengan waktu
00:00:00
.Waktu Joda
UPDATE: Proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time . Lihat Jawaban saya yang lain untuk solusi java.time.
Jika sebaliknya Anda ingin waktu hari disetel ke momen pertama hari itu, gunakan
DateTime
objek di perpustakaan Joda-Time dan panggilwithTimeAtStartOfDay
metodenya. Sadarilah bahwa momen pertama mungkin bukan waktu00:00:00
karena Daylight Saving Time atau mungkin anomali lainnya.sumber
Hanya
clear()
bidang yang berlebihan.Dari Java 8 opsi yang lebih baik adalah menggunakan
truncatedTo
metodeLocalDateTime
, misalnya:sumber
calendar.clear(Calendar.HOUR_OF_DAY);
tidak buka jam. Solusi dari @cletus berfungsi dengan baik.Saya benar-benar kesal karena konstruktor kalender baru yang "ditingkatkan" tidak menggunakan int untuk milidetik seperti Tanggal lama yang "buruk". Saya kemudian benar-benar kesal dan menulis ini:
Saya tidak menggunakan kata "barang" pada saat itu, tetapi kemudian saya menemukan kebahagiaan dari ini:
Tapi aku masih kesal.
sumber
Saya memperbaiki masalah seperti ini (di zona delapan Timur (waktu Beijing)):
Pertama-tama, Anda harus jelas apa itu cap waktu. Stempel waktu adalah total milidetik dari 01 Jan 00:00:00 1970 GMT (sama dengan UTC), atau Kam 01 Jan 08:00:00 CST 1970 hingga sekarang.
Ingat: Stempel waktu tidak bergantung pada zona waktu.
Jadi Anda mendapatkan hasil yang sama dengan pernyataan berikut di zona waktu yang berbeda:
Dan
mencetak info waktu yang berbeda dalam zona waktu yang berbeda: Jika Anda menyetel zona waktu pc Anda sebagai UTC, Anda mendapatkan
Tetapi jika Anda menyetel zona waktu sebagai (UTC +8: 00) Beijing, Chongqing, HongKong, Urumq, Anda mendapatkan:
Java mendapatkan cap waktu, kemudian menampilkan info tanggal dan waktu sesuai zona waktu.
Untuk pengenalan tentang bagaimana Java menampilkan info tanggal dan waktu di zona waktu yang berbeda, cara mentransformasikan info waktu itu mudah. Anda harus mendapatkan stempel waktu, dan mempertimbangkan zona waktu saat memotong info waktu. Kemudian Anda dapat membuat objek Tanggal baru dengan cap waktu potong (kita bisa menyebutnya cap tanggal), java akan mengkompensasi zona waktu saat menampilkan info tanggal.
Seperti di zona delapan Timur (waktu Beijing), waktu Beijing lebih awal 8 jam dari GMT, jadi Anda harus mengurangi lebih dari 8 jam saat Anda melakukan operasi modulo. Artinya, Anda harus mendapatkan waktu GMT terlebih dahulu, kemudian Java akan menambahkan 8 jam waktu tampilan berdasarkan pengaturan zona waktu komputer Anda.
Masalah zona waktu tidak jelas, dan juga membingungkan saya untuk waktu yang lama. Sekarang saya membuatnya jelas. Semoga membantu.
04-01-2018 Metode di bawah ini juga berfungsi.
}
sumber
Anda dapat melakukan ini untuk menghindari masalah zona waktu:
Meskipun
Date
objek Java adalah nilai timestamp, tetapi selama truncate akan dikonversi ke zona waktu lokal, sehingga Anda akan mendapatkan nilai yang mengejutkan jika Anda mengharapkan nilai dari zona waktu UTC.sumber
Calendar
danDate
menjadi warisan bertahun-tahun yang lalu dengan kelas java.time menerapkan JSR 310 di Java 8 dan yang lebih baru. Menyarankan penggunaannya pada tahun 2018 adalah saran yang buruk.Mungkin respons yang terlambat tetapi berikut adalah cara untuk melakukannya dalam satu baris tanpa menggunakan pustaka apa pun:
sumber
Dengan Joda-Time sejak versi 2.0 Anda dapat menggunakan
LocalDate.toDate()
.Secara sederhana
sumber
a Java Date object
demikian saya gunakanjava.util.Date
. Selain itu tidak menjelaskan bagaimana zona waktunya bermasalah dengan java.util.Date (kapan? Dimana?) Meskipun dia tidak bisa membantu menggunakan selainDate
.Untuk semua jawaban yang menggunakan Kalender, Anda harus menggunakannya seperti ini
Tapi saya lebih suka ini:
sumber
java.sql.Date
kelas berpura-pura untuk mewakili nilai tanggal-satunya tetapi sebenarnya memiliki waktu-of-hari disesuaikan dengan zona waktu UTC. Jadi bukan solusi yang tepat untuk Pertanyaan tersebut.Berikut cara sederhana untuk mendapatkan tanggal tanpa waktu jika Anda menggunakan Java 8+: Gunakan tipe java.time.LocalDate, bukan Date.
Hasil:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
sumber
LocalDate
adalah ide yang bagus untuk sebagian besar tujuan, tetapi tidak jelas bagaimana ini akan bekerja dengan masukan dari pertanyaan2008-01-01 13:15:00
,.