cara membuat objek Java Date tengah malam hari ini dan tengah malam besok?


178

Dalam kode saya, saya perlu menemukan semua hal yang terjadi hari ini. Jadi saya perlu membandingkan tanggal mulai hari ini pukul 00:00 (tengah malam dini hari ini) hingga pukul 12:00 malam (tengah malam malam ini).

Aku tahu ...

Date today = new Date(); 

... menangkap saya sekarang. Dan ...

Date beginning = new Date(0);

... membuat saya nol waktu pada 1 Januari 1970. Tapi apa cara mudah untuk mendapatkan nol waktu hari ini dan nol waktu besok?

MEMPERBARUI; Saya melakukan ini, tetapi pasti ada cara yang lebih mudah?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();

Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();

3
Menurut saya, Joda Time lebih mudah, lihat bagian akhir jawaban saya. Jika Anda ingin menggunakan java.util.Date/Calendar yang harus Anda lakukan dengan cara ini, tidak ada cara yang lebih mudah untuk melakukannya.
timaschew

RE: komentar timaschew untuk menggunakan Joda-Time, tahu bahwa proyek Joda-Time sekarang dalam mode pemeliharaan, dan menyarankan migrasi ke kelas java.time.
Basil Bourque

1
FYI, sangat merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .
Basil Bourque

2
Jarang sekali melihat begitu banyak jawaban yang salah untuk satu pertanyaan. Saya merekomendasikan jawabannya oleh Basil Bourque , itu benar dan luas.
Ole VV

Jawaban:


344

java.util.Calendar

// today    
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// next day
date.add(Calendar.DAY_OF_MONTH, 1);

JDK 8 - java.time.LocalTime dan java.time.LocalDate

LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);

Joda-Time

Jika Anda menggunakan JDK <8, saya sarankan Joda Time , karena APInya sangat bagus:

DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);

Karena Joda Time versi 2.3 DateMidnightsudah tidak digunakan lagi , jadi gunakan ini:

DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();

Lewati zona waktu jika Anda tidak ingin zona waktu default JVM saat ini.

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.

Terima kasih atas bantuannya, saya baru saja memperbarui pertanyaan awal saya dengan bagaimana saya saat ini melakukannya. Terima kasih untuk sarannya.

3
Pada JodaTime 2.3, toDateMidnightsudah usang. Lihat jawaban ini untuk detail: stackoverflow.com/a/19048833/363573
Stephan

menambahkan solusi untuk JDK 8
timaschew

1
@timaschew Meskipun secara umum benar, saya sarankan melakukan java.time menggunakan nilai tanggal-waktu yang dikategorikan ( ZonedDateTime) seperti yang Anda lakukan di bagian Joda-Time. The Local…jenis tidak memiliki informasi zona waktu - yang seluruh tujuan mereka, tidak ada kehilangan / mengabaikan semua offset dan zona waktu rincian. Terutama ketika Pertanyaan berbicara tentang menggunakan nilai-nilai ini untuk perbandingan (mungkin permintaan basis data?), Nilai tanggal-waktu yang dikategorikan cenderung lebih berguna.
Basil Bourque

1
@Amalgovinus Pastikan untuk mengatur Calendar.HOUR_OF_DAY, bukan Calendar.HOUR.
Oswald

43

Demi kelengkapan, jika Anda menggunakan Java 8 Anda juga dapat menggunakan truncatedTometode Instantkelas untuk mendapatkan tengah malam di UTC .

Instant.now().truncatedTo(ChronoUnit.DAYS);

Seperti yang tertulis di Javadoc

Misalnya, memotong dengan unit MENIT akan membulatkan ke menit terdekat, mengatur detik dan nanodetik ke nol.

Semoga ini bisa membantu.


1
Terima kasih atas petunjuknya. Mendapatkan tengah malam di zona waktu tertentu menjadi lebih panjang:Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
Vadzim


33

Cara termudah untuk menemukan tengah malam:

Long time = new Date().getTime();
Date date = new Date(time - time % (24 * 60 * 60 * 1000));

Hari berikutnya:

Date date = new Date(date.getTime() + 24 * 60 * 60 * 1000);

Saya menjalankan kode itu dan mendapat: Midnight: Kamis 01 Nov 19:00:00 CDT 2012
Dave

3
Jika Anda melakukan sesuatu seperti System.out.print (tanggal), sistem mengubah instance tanggal ke zona waktu sistem (CDT). 19:00 dalam CDT adalah tengah malam dalam GMT. Jika Anda memerlukan tengah malam di zona waktu yang dipilih, Anda harus menambahkan offset zona waktu ini, dengan mempertimbangkan DST.
Andrei Volgin

@ Pembicara Itu. Ada banyak waktu 'tengah malam' berbeda di Bumi terlepas dari metode apa yang Anda gunakan, tetapi hanya ada satu Jawa tengah malam.
Andrei Volgin

2
@Andrei Volgin Tidak tahu bahwa ada "java tengah malam". ;) Apa yang ingin saya katakan bahwa solusi ini tidak terlalu membantu pembuat topik. Solusi kalender menghindari kalkulasi kedua yang buruk dan mengatur zona waktu (dan terutama waktu penghematan cahaya hari, dll.) Bila digunakan dengan benar. Saya tidak melihat itu dalam solusi Anda.
Bouncner

Hai @AndreiVolgin, saya dapat tanggal Tanggal = Tanggal baru (waktu + TimeZone.getDefault (). GetRawOffset () - time% (24 * 60 * 60 * 1000));
jrey

28

Ingat, Dateini tidak digunakan untuk mewakili tanggal (!). Untuk mewakili tanggal, Anda memerlukan kalender. Ini:

Calendar c = new GregorianCalendar();

akan membuat Calendarinstance yang mewakili tanggal sekarang di zona waktu Anda saat ini. Sekarang yang Anda butuhkan adalah memotong setiap bidang di bawah hari (jam, menit, detik, dan milidetik) dengan mengaturnya ke0 . Anda sekarang memiliki tengah malam hari ini.

Sekarang untuk mendapatkan tengah malam hari berikutnya, Anda perlu menambahkan satu hari:

c.add(Calendar.DAY_OF_MONTH, 1);

Perhatikan bahwa menambahkan 86400 detik atau 24 jam salah karena waktu musim panas yang mungkin terjadi sementara itu.

PEMBARUAN: Namun cara favorit saya untuk mengatasi masalah ini adalah dengan menggunakan kelas DateUtils dari Commons Lang :

Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);

Itu menggunakan di Calendarbelakang layar ...


15
Terima kasih untuk bantuannya. "Tanggal tidak digunakan untuk mewakili tanggal" - kita akan sangat brilian, bukan? ;)

@RobertHume Agar adil, Date telah ada sejak rilis pertama Java. Kebanyakan hal dari era itu ... kurang dipikirkan dengan sempurna. Terutama karena Jawa adalah yang pertama mencoba hal-hal yang dicoba, dan ada jauh dari standar yang disepakati untuk bagaimana melakukannya.
Dana Gugatan Monica

14

metode ini akan membantu Anda-

public static Date getStartOfDay(Date date) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);
     calendar.set(Calendar.HOUR_OF_DAY, 0);
     calendar.set(Calendar.MINUTE, 0);
     calendar.set(Calendar.SECOND, 0);
     calendar.set(Calendar.MILLISECOND, 0);
     return calendar.getTime();
 }

dan

public static Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    return calendar.getTime();
}

9

Pada JodaTime 2.3, toDateMidnight()sudah usang.

Dari Tingkatkan dari 2.2 ke 2.3

    Penghentian sejak 2.2
    ----------------------
    - DateMidnight [# 41]
     Kelas ini cacat dalam konsep
     Waktu tengah malam kadang-kadang tidak terjadi di beberapa zona waktu
     Ini adalah hasil dari penghematan waktu siang hari dari pukul 00:00 hingga 01:00
     DateMidnight pada dasarnya adalah DateTime dengan waktu dikunci ke tengah malam
     Konsep seperti itu pada umumnya lebih buruk untuk digunakan, mengingat LocalDate
     Ganti DateMidnight dengan LocalDate
     Atau ganti dengan DateTime, mungkin menggunakan metode withTimeAtStartOfDay ()

Berikut adalah contoh kode tanpa toDateMidnight()metode.

Kode

DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));

Output ( mungkin berbeda tergantung pada zona waktu lokal Anda )

2013-09-28 00:00:00

2
Jawaban yang sangat bagus. Saya akan membuat penambahan lewat DateTimeZonecontoh ke DateTimekonstruktor itu untuk menekankan pentingnya menentukan zona waktu daripada secara tidak sengaja tergantung pada default:DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
Basil Bourque

9

Jawaban lain benar, terutama jawaban java.time oleh arganzheng . Seperti yang disebutkan beberapa orang, Anda harus menghindari kelas java.util.Date/.Calendar yang lama karena kelasnya dirancang dengan buruk, membingungkan, dan menyusahkan. Mereka telah digantikan oleh kelas java.time.

Izinkan saya menambahkan catatan tentang strategi penanganan tengah malam dan rentang waktu .

Setengah Terbuka

Dalam pekerjaan waktu-tanggal, rentang waktu sering didefinisikan menggunakan pendekatan "Setengah Terbuka". Dalam pendekatan ini, permulaan bersifat inklusif sedangkan akhiran bersifat eksklusif . Ini menyelesaikan masalah dan jika digunakan secara konsisten membuat alasan tentang penanganan tanggal Anda jauh lebih mudah.

Satu masalah yang dipecahkan adalah mendefinisikan akhir hari. Apakah momen terakhir dalam sehari 23:59:59.999( milidetik )? Mungkin, di kelas java.util.Date (dari Jawa paling awal; merepotkan - hindari kelas ini!) Dan di perpustakaan Joda-Time yang sangat sukses . Tetapi dalam perangkat lunak lain, seperti database seperti Postgres, saat terakhir adalah 23:59:59.999999( mikrodetik ). Tetapi dalam perangkat lunak lain seperti kerangka java.time (dibangun ke dalam Java 8 dan yang lebih baru, penerus Joda-Time) dan dalam beberapa database seperti H2 Database , momen terakhir mungkin 23:59.59.999999999( nanoseconds ). Alih-alih membelah rambut, pikirkan dalam hal saat pertama saja, bukan saat terakhir.

Di Setengah Terbuka, satu hari berjalan dari saat pertama dalam satu hari dan naik ke atas tetapi tidak termasuk saat pertama pada hari berikutnya. Jadi daripada berpikir seperti ini:

… Mulai hari ini pukul 00:00 (tengah malam dini hari tadi) hingga pukul 12:00 (tengah malam malam ini).

... berpikir seperti ini ...

dari saat pertama hari ini berjalan hingga tetapi tidak termasuk saat pertama besok:
(> = 00:00:00.0hari ini DAN < 00:00:00.0besok)

Dalam pekerjaan basis data, pendekatan ini berarti tidak menggunakan BETWEENoperator dalam SQL.

Mulai hari ini

Lebih jauh lagi, momen pertama hari itu tidak selalu merupakan waktu hari itu 00:00:00.0. Daylight Saving Time (DST) di beberapa zona waktu, dan mungkin anomali lain, dapat berarti waktu yang berbeda memulai hari.

Jadi, biarkan kelas java.time melakukan pekerjaan menentukan awal hari dengan panggilan ke LocalDate::atStartOfDay( ZoneId ). Jadi kita harus melewati LocalDatedan kembali ZonedDateTimeseperti yang Anda lihat dalam kode contoh ini.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );

Perhatikan lewatnya opsional ZoneId. Jika dihilangkan zona waktu default JVM Anda saat ini diterapkan secara implisit. Lebih baik bersikap eksplisit.

Zona waktu sangat penting untuk pekerjaan tanggal-waktu. Pertanyaan dan beberapa Jawaban lainnya berpotensi cacat karena tidak secara sadar menangani zona waktu.

Mengubah

Jika Anda harus menggunakan java.util.Date atau .Calendar, cari metode konversi baru yang ditambahkan ke kelas lama tersebut.

java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );

Rentang waktu

Omong-omong, jika Anda melakukan banyak pekerjaan dengan rentang waktu, perhatikan:

  • Duration
  • Period
  • Interval
    The Intervalkelas ditemukan dalam ThreeTen-Extra proyek, perpanjangan kerangka java.time. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time.
    Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );

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. Spesifikasi adalah JSR 310 .

Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu untuk java.sql.*kelas.

Di mana mendapatkan kelas java.time?

Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .


6

waktu java

Jika Anda menggunakan Java 8 dan yang lebih baru, Anda dapat mencoba paket java.time ( Tutorial ):

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());

2
Jawaban yang bagus. Saya akan menyarankan menentukan zona waktu yang diinginkan / diharapkan. Zona waktu default JVM saat ini dapat bervariasi berdasarkan pengaturan OS, mengubah komputer, atau aplikasi apa pun di utas JVM yang mengubah default setiap saat selama runtime.
Basil Bourque

4

Ini tampaknya menjadi opsi:

DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));

untuk menambah hari untuk itu, baik

Date tomorrow = new Date(thisMorningMidnight.getTime() + 24 * 60 * 60 * 1000);

atau

Calendar c = Calendar.getInstance();
c.setTime(thisMorningMidnight);
c.add(Calendar.DATE, 1);
Date tomorrowFromCalendar = c.getTime();

Saya punya firasat yang terakhir lebih disukai dalam hal sesuatu yang aneh seperti penghematan siang hari menyebabkan penambahan 24 jam tidak cukup (lihat https://stackoverflow.com/a/4336131/32453 dan jawaban lainnya).


Saya memiliki tanggal dan waktu dalam sehari yang direpresentasikan sebagai panjang dalam basis data sqlite saya. Saya harus menunggu lama di hari berikutnya. Apakah saya masih dapat menggunakan objek Date dengan saya daripada menggunakan metode SimpleDateFormat yang Anda gunakan di atas?
AJW

1
Selama ini adalah milidetik yang tepat, Anda dapat meneruskannya sebagai konstruktor: docs.oracle.com/javase/7/docs/api/java/util/…
rogerdpack

1

Saya melakukan ini secara berbeda dari semua orang di sini. Saya baru di Jawa, jadi mungkin solusi saya buruk.

Date now = new Date();
Date midnightToday = new Date(now.getYear(), now.getMonth(), now.getDate());

Saya belum yakin ini berfungsi, tetapi bagaimanapun juga, saya menghargai umpan balik tentang solusi ini.

Saya bingung dengan pernyataan di atas yang dapat Anda hitung besok dengan menelepon:

c.add(Calendar.DAY_OF_MONTH, 1);

Jika Anda menambahkan 1 ke hari dalam sebulan dan ini adalah hari ke-31, tidakkah Anda mendapatkan hari ke-32 dalam sebulan?

Mengapa waktu / tanggal tidak semuanya berdasarkan UTC di Jawa? Saya akan berpikir Zona Waktu hanya diperlukan ketika digunakan dengan i / o, tetapi secara internal harus selalu digunakan dalam UTC. Namun, kelas-kelas tersebut tampaknya menyertakan info Timezone yang tampaknya tidak hanya boros, tetapi juga rentan terhadap kesalahan pengkodean.


2
Hai Mitch. Saya pikir solusi Anda berfungsi, tetapi sepertinya konstruktor Date sudah usang. Orang-orang Jawa mencabut sebagian besar metode terkait Tanggal asli beberapa waktu lalu dan menggantinya dengan metode terkait Kalender yang lebih baru. Secara pribadi saya tidak melihat bagaimana ini merupakan peningkatan, tetapi tidak disukai untuk menggunakan metode yang sudah usang. Terima kasih!

Sedih dengan penghinaan itu. Tampaknya jauh lebih bersih bagi saya untuk menentukan tahun, bulan, dan tanggal daripada menghapus jam, menit, detik, dan milidetik. Membersihkan ini bergantung pada milidetik menjadi rincian terbaik dari kelas Date, sedangkan solusi saya tidak. Solusi saya juga lebih pendek dan lebih jelas. Menjadi orang baru di Jawa membuat saya sangat menghargai betapa bersih, mudah dan efisiennya C ++ ketika menggunakan tanggal dan waktu.
Mitch

@Mitch Menurut pengalaman saya, bahasa paling baru yang Anda pelajari selalu dianggap sebagai yang paling rumit.
ArtOfWarfare

FYI: kelas-tanggal tua yang mengerikan ini sekarang adalah warisan, digantikan oleh kelas java.time modern.
Basil Bourque


0

Cara paling sederhana dengan JodaTime

DateMidnight date = DateMidnight.now();


2
Tidak. Kelas dan metode yang terkait "tengah malam" di Joda-Time semuanya telah ditinggalkan. Mereka didasarkan pada konsep yang cacat. Momen pertama hari itu tidak selalu 00:00:00.000. Alih-alih gunakan withTimeAtStartOfDaymetode baru . Perbarui ke Joda-Time versi 2.4 saat ini dan baca catatan rilis. Contoh:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Basil Bourque

0

Karena satu hari adalah 24 * 60 * 60 * 1000ms, tengah malam hari ini dapat dihitung sebagai ...

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`

1
Kode ini hanya berlaku untuk UTC dan tidak ada zona waktu lainnya, dan mengabaikan anomali seperti Waktu Musim Panas. Selain itu, roll-date-time solusi Anda sendiri tidak bijaksana karena ini adalah topik yang sangat rumit. Gunakan kelas java.time yang sangat baik sebagai gantinya.
Basil Bourque

0

Cukup banyak jawaban sebelumnya, tetapi tidak ada yang menyebutkan parameter AM_PM:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);

1
Kelas yang merepotkan Calendardigantikan bertahun-tahun yang lalu oleh kelas java.time , khususnya ZonedDateTime.
Basil Bourque

0
Date now= new Date();
// Today midnight
Date todayMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY);

// tomorrow midnight
Date tomorrowMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY + DateUtils.MILLIS_PER_DAY);

Ini hanya berfungsi untuk UTC, dan gagal menangani zona waktu. Juga, Datekelas yang mengerikan digantikan tahun yang lalu oleh java.time.Instant. Hindari penggunaan Datesaat ini.
Basil Bourque

0

Menggunakan apache commons ..

//For midnight today 
Date today = new Date(); 
DateUtils.truncate(today, Calendar.DATE);

//For midnight tomorrow   
Date tomorrow = DateUtils.addDays(today, 1); 
DateUtils.truncate(tomorrow, Calendar.DATE);

FYI, sangat merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .
Basil Bourque

@ BasilBourque Setuju untuk Java 8. Tetapi jika OP menggunakan Java 7, saya kira itu tetap bekerja.
joe4java

Hampir semua fungsi java.time tersedia untuk Java 6 & 7 di proyek ThreeTen-Backport dengan API yang hampir sama. Lebih lanjut diadaptasi untuk Android <26 dalam proyek ThreeTenABP . Jadi tidak perlu lagi menggunakan kelas tanggal waktu lama yang menyedihkan itu.
Basil Bourque

-1

Saya tahu ini posting yang sangat lama. Saya berpikir untuk membagikan pengetahuan saya di sini!

Untuk tanggal Pertengahan malam hari ini dengan zona waktu yang tepat, Anda dapat menggunakan yang berikut

public static Date getCurrentDateWithMidnightTS(){

    return new Date(System.currentTimeMillis() - (System.currentTimeMillis()%(1000*60*60*24)) - (1000*60 * 330));
}

Dimana (1000*60 * 330) sedang dikurangi yaitu sebenarnya terkait dengan zona waktu misalnya zona waktu India yaitu kolkata berbeda +5: 30hrs dari yang sebenarnya. Jadi kurangi itu dengan mengubahnya menjadi milidetik.

Jadi, ubah angka yang dikurangi terakhir menurut Anda. Saya membuat produk yaitu hanya berbasis di India Jadi hanya menggunakan cap waktu tertentu.


1
Mengapa Anda menyarankan ini alih-alih jawaban yang diterima? Menggulirkan nilai tanggal-waktu Anda berisiko secara umum. Khususnya kode ini dikodekan ke offset zona waktu tunggal untuk selamanya. Tidak ada akuntansi untuk Daylight Saving Time atau anomali lainnya. Saya hanya melihat kerugian tanpa nilai tambah.
Basil Bourque

@ Basil tentu saja saya menerima jawaban dan ya saya sebutkan di sana untuk nilai kode keras. Ini hanya membantu jika Anda bekerja di zona waktu tertentu.
Rajeev

-1
Date todayMidnightUTC = java.sql.Date.valueOf(LocalDate.now());
Date tomorrowMidnightUTC = java.sql.Date.valueOf(LocalDate.now().plusDays(1));
Date anyMidnightLocal = java.sql.Date.valueOf(LocalDate.from(dateTime.toInstant().atZone(ZoneId.systemDefault())));

Namun waspadalah yang java.sql.Date.toInstant()selalu melemparUnsupportedOperationException .

Via LocalDate ke java.util.Date dan sebaliknya konversi paling sederhana?


Bukan jawaban yang bagus. Anda mencampurkan penggunaan java.time modern dengan kelas-kelas lawas lama yang digantikannya. Dan secara khusus Anda menggunakan kelas date-time java.sql yang seharusnya hanya digunakan untuk bertukar data dengan database yang drivernya belum diperbarui untuk berhubungan langsung dengan kelas java.time, tidak pernah digunakan untuk logika bisnis. Namun masalah lain adalah Anda mengabaikan masalah krusial zona waktu.
Basil Bourque

@ BasilBourque, terima kasih atas kritiknya. Menggunakan satu kelas legacy yang tidak ditandai sebagai usang untuk mendapatkan instance kelas legacy lain cukup aman. Masalah zona waktu lebih penting. Saya memutuskan untuk tetap dengan jawaban riccardo .
Vadzim

-1

Cara kuno ..

private static Date getDateWithMidnight(){
    long dateInMillis = new Date().getTime();
    return new Date(dateInMillis - dateInMillis%(1000*60*60*24) - TimeZone.getDefault().getOffset(dateInMillis));
}

Kelas yang merepotkan itu digantikan bertahun-tahun yang lalu oleh kelas java.time.Instant . Tidak perlu pernah digunakan Date.
Basil Bourque

Itu Datekelas selalu dalam UTC. Jadi, Anda mengabaikan masalah zona waktu yang diinginkan / diharapkan. Misalnya, hari baru tiba di Kolkata India beberapa jam lebih awal dari pada UTC, dan beberapa jam lebih lambat dari UTC di Montréal Québec.
Basil Bourque
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.