Saya mengalami masalah saat menyetel ulang jam di Java. Untuk tanggal tertentu saya ingin menyetel jam ke 00:00:00.
Ini kode saya:
/**
* Resets milliseconds, seconds, minutes and hours from the provided date
*
* @param date
* @return
*/
public static Date trim(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
return calendar.getTime();
}
Masalahnya adalah bahwa kadang-kadang waktunya 12:00:00
dan kadang-kadang begitu 00:00:00
dan ketika saya menanyakan database untuk entitas yang disimpan di 07.02.2013 00:00:00
dan waktu entitas aktual, yang disimpan, adalah12:00:00
kueri gagal.
saya tahu itu 12:00:00 == 00:00:00
!
Saya menggunakan AppEngine. Apakah ini bug appengine, masalah atau masalah lain? Atau apakah itu tergantung pada hal lain?
java
java.util.calendar
Adelin
sumber
sumber
java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .calendar.set(Calendar.HOUR_OF_DAY, 0);
, untuk tujuan saya, ini bekerja dengan baik.Jawaban:
Gunakan konstanta lain sebagai pengganti
Calendar.HOUR
, gunakanCalendar.HOUR_OF_DAY
.Calendar.HOUR
menggunakan 0-11 (untuk digunakan dengan AM / PM), danCalendar.HOUR_OF_DAY
menggunakan 0-23.Mengutip Javadocs:
dan
Pengujian ("sekarang" saat ini sekitar 14:55 pada 23 Juli 2013 Waktu Musim Panas Pasifik):
Keluaran:
sumber
Calendar.HOUR
tidak akan menyetel PM ke AM, meninggalkannya sebagai jam 12 siang.java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .java.time
Menggunakan
java.time
kerangka kerja bawaan Java 8 dan yang lebih baru. Lihat Tutorial .Jika Anda tidak membutuhkan waktu (jam, menit, detik, dll.) Pertimbangkan untuk menggunakan
LocalDate
kelas.sumber
LocalDateTime
adalah kelas yang salah untuk digunakan untuk ini. Ini tidak dapat mewakili momen karena tidak memiliki konsep zona waktu atau offset-dari-UTC. MeneleponLocalDateTime.now
hampir tidak pernah masuk akal. GunakanZonedDateTime
sebagai gantinya. Jika tidak, Anda mengabaikan masalah zona waktu yang krusial. Untuk satu hal, beberapa tanggal di beberapa zona tidak dimulai pada 00:00!Berikut adalah beberapa fungsi utilitas yang saya gunakan untuk melakukan hal ini.
sumber
Satu lagi JAVA 8 cara:
Tetapi jauh lebih berguna untuk mengedit tanggal yang sudah ada.
sumber
LocalDateTime
tidak dapat mewakili momen, karena tidak memiliki konsep zona waktu atau offset-dari-UTC. MeneleponLocalDateTime.now
hampir tidak pernah masuk akal. Anda harus menggunakanZonedDateTime
sebagai gantinya.Anda sebaiknya menyetel zona waktu ke komponen DateFormat seperti ini:
Kemudian Anda bisa mendapatkan waktu "00:00:00" dengan meneruskan 0 milidetik ke formatter:
atau Anda dapat membuat objek Tanggal:
atau Anda dapat memiliki lebih banyak kemungkinan menggunakan komponen Kalender tetapi Anda juga harus mengatur zona waktu sebagai GMT ke contoh kalender:
sumber
tl; dr
java.time
Anda menggunakan kelas tanggal-waktu lama yang mengerikan yang telah diganti bertahun-tahun yang lalu oleh kelas java.time modern yang ditentukan di JSR 310.
Date
➙Instant
A
java.util.Date
mewakili momen dalam UTC. Penggantinya adalahInstant
. Panggil metode konversi baru yang ditambahkan ke kelas lama.Zona waktu
Tentukan zona waktu yang Anda inginkan untuk waktu-of-hari Anda yang baru.
Tentukan nama zona waktu yang tepat dalam format
Continent/Region
, sepertiAmerica/Montreal
,Africa/Casablanca
, atauPacific/Auckland
. Jangan pernah menggunakan singkatan 2-4 huruf sepertiEST
atauIST
karena itu bukan zona waktu yang sebenarnya, tidak terstandarisasi, dan bahkan tidak unik (!).ZonedDateTime
Terapkan
ZoneId
keInstant
untuk mendapatkan aZonedDateTime
. Momen yang sama, titik yang sama di garis waktu, tetapi waktu jam dinding yang berbeda.Mengubah waktu hari
Anda meminta untuk mengubah waktu hari. Terapkan a
LocalTime
untuk mengubah semua bagian waktu hari: jam, menit, detik, pecahan detik. Yang baruZonedDateTime
dibuat instance-nya, dengan nilai-nilai berdasarkan aslinya. The java.time kelas menggunakan ini objek abadi pola untuk menyediakan benang-keselamatan .Momen pertama hari ini
Tapi Anda meminta secara khusus untuk 00:00. Jadi rupanya Anda menginginkan momen pertama hari itu. Hati-hati: beberapa hari di beberapa zona tidak dimulai pada 00:00:00. Mereka mungkin mulai pada waktu lain seperti 01:00:00 karena anomali seperti Daylight Saving Time (DST).
Biarkan java.time menentukan momen pertama. Ekstrak bagian khusus tanggal. Kemudian lewati zona waktu untuk mendapatkan momen pertama.
Sesuaikan dengan UTC
Jika Anda perlu kembali ke UTC, ekstrak file
Instant
.Instant
➙Date
Jika Anda membutuhkan
java.util.Date
untuk beroperasi dengan kode lama yang belum diperbarui ke java.time , ubah.sumber
Melakukan ini bisa lebih mudah (Di Java 8)
sumber
Kita dapat mengatur bagian waktu java.util.Date ke 00:00:00 Dengan menggunakan kelas LocalDate dari Java 8 / Joda-datetime api :
sumber
Jika Anda membutuhkan format 00:00:00 dalam string, Anda harus menggunakan SimpleDateFormat seperti di bawah ini. Menggunakan "H", bukan "h".
sumber
Cara lain untuk melakukannya adalah dengan menggunakan DateFormat tanpa detik:
sumber
Anda dapat melakukan ini dengan yang berikut:
sumber
Karena Java8 menambahkan fungsi Tanggal baru, kita dapat melakukan ini dengan mudah.
sumber
LocalDateTime
tidak dapat mewakili momen, karena tidak memiliki konsep zona waktu atau offset-dari-UTC. MeneleponLocalDateTime.now
hampir tidak pernah masuk akal. Anda harus menggunakanZonedDateTime
sebagai gantinya.