Tanggal Jawa memotong informasi waktu

121

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.

Marco
sumber

Jawaban:

178

Cara yang disarankan untuk melakukan manipulasi tanggal / waktu adalah dengan menggunakan Calendarobjek:

Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();
cletus
sumber
2
@cletus, Apakah mungkin untuk menghapus waktu dari objek Tanggal. Saya ingin tanggal murni seperti 2008-01-01 tanpa porsi waktu.
Prem
2
Saya tidak akan mengatakan java.util.Calendar direkomendasikan. Sun / Oracle menggantikan kelas itu di Java 8 dengan paket java.time yang baru. Gunakan itu atau Joda-Time.
Basil Bourque
3
Kalender tidak lagi direkomendasikan. Lihat stackoverflow.com/a/28868089/40064 jika Anda menggunakan Java 8.
Wim Deblauwe
2
FYI, kelas tanggal-waktu lama yang merepotkan seperti java.util.Calendarsekarang sudah lama , digantikan oleh kelas java.time . Lihat Tutorial oleh Oracle .
Basil Bourque
148

Pernahkah Anda melihat metode pemotongan DateUtils di Apache Commons Lang?

Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);

akan menghapus elemen waktu.

SAYA
sumber
9
Tautan diperbarui lagi (ayolah Apache! Berhenti memindahkan dokumen Anda!)
Ogre Mazmur33
6
Minus dari pendekatan ini bahwa zona waktu dalam operasi pemotongan dilakukan selalu zona waktu PC lokal. Jadi, jika Anda bekerja dengan kalender dan tanggal di zona waktu UTC atau di zona waktu mana pun selain zona waktu lokal - ini dapat memotong tanggal tidak seperti yang dimaksudkan.
Cloud
seperti yang ditunjukkan @Cloud, fakta bahwa saya tidak melihat contoh Kalender di sini (tidak dapat mengontrolnya) membuat saya sedikit gugup :)
Jaroslav Záruba
Metode itu sangat panjang dan memiliki setidaknya dua perbaikan bug.
Pino
42

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)

LocalDate date = new LocalDateTime(milliseconds).toLocalDate()

Selain itu, ini memecahkan beberapa masalah keamanan thread dengan format tanggal / waktu dan sangat disarankan untuk menangani masalah tanggal / waktu di Java.

Brian Agnew
sumber
12
Saya yakin begitu. Ini adalah rekomendasi untuk menggunakan perpustakaan yang lebih baik daripada bertempur dengan kelas java.util yang rusak (sebagaimana dibuktikan oleh pertanyaan)
Brian Agnew
10
Tentu berkaitan, Joda adalah Pustaka untuk manipulasi tanggal, waktu & kalender di Jawa. Akan menjadi kelalaian jika tidak merekomendasikannya.
Joel
1
Masalah keamanan benang sangat menarik, saya menemukan posting ini meneliti kesalahan Oracle / Hibernate "IllegalArgumentException, sun.util.calendar.ZoneInfo.getOffset (ZoneInfo), oracle.jdbc.driver.DateCommonBinder.zoneOffset (OraclePreparedStatement)". Ini berbicara tentang masalah Oracle lain yang hanya muncul di forum beban berat.oracle.com/forums/thread.jspa?threadID=325576 Sangat sulit bahkan untuk membuat objek dengan milidetik yang tidak valid dalam kode normal. Bagi saya, saya pikir saya akan downcast di thread saya menggunakan Joda, daripada membiarkan Oracle menggunakan hal-hal non-Joda yang mungkin dicurigai.
Mark Bennett
4
Saya berharap saya bisa memberikan suara negatif kepada semua orang yang memilih ini. Siapakah orang-orang ini yang memberi balasan +1 yang bahkan tidak berusaha menjawab pertanyaan? Jawaban menggunakan Joda akan lebih dari diterima, tapi ini bukan ...
Ryan
1
@ Ryan Bagaimana jawaban ini tidak relevan? Pertanyaan menanyakan tanggal tanpa waktu dalam sehari. Jawaban ini menyajikan kelas yang tujuan utamanya adalah mewakili tanggal tanpa waktu dalam sehari.
Basil Bourque
35

Hanya pembaruan cepat sehubungan dengan kelas java.time sekarang dibangun di Java 8 dan yang lebih baru.

LocalDateTimememiliki truncatedTometode yang secara efektif membahas apa yang Anda bicarakan di sini:

LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)

Ini akan mengungkapkan waktu saat ini menjadi menit saja:

2015-03-05T11:47

Anda dapat menggunakan ChronoUnit(atau a TemporalUnit) yang lebih kecil dari DAYS untuk menjalankan pemotongan (karena pemotongan hanya diterapkan ke bagian waktu LocalDateTime, bukan ke bagian tanggal).

Adam Berry
sumber
3
Anda hanya dapat menggunakan ChronoUnits hingga DAYS - unit yang lebih tinggi akan memberikan pengecualian.
assylias
26
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
date = cal.getTime();
naik opelet
sumber
22

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, toDateMidnightsudah usang atau dinamai dengan tepat withTimeAtStartOfDay(), membuat

DateTime.now().withTimeAtStartOfDay()

bisa jadi.

Manfaat ditambahkan dari API yang jauh lebih baik.

Dengan versi yang lebih lama, Anda bisa melakukannya

new DateTime(new Date()).toDateMidnight().toDate()
h7r
sumber
6
Metode dan class terkait tengah malam di Joda-Time sekarang tidak digunakan lagi. Para pengembang merekomendasikan untuk tidak menggunakannya. Sebaliknya gunakan metode ini withTimeAtStartOfDay.
Basil Bourque
Terima kasih telah menunjukkannya. Memperbarui jawaban untuk mempertimbangkan ini.
h7r
Anda juga bisa menggunakan toLocalDateuntuk mendapatkan objek yang bahkan tidak memiliki komponen waktu.
Charles Wood
FYI, proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time . Lihat Tutorial oleh Oracle .
Basil Bourque
8

Saya melakukan pemotongan dengan java8 API baru. Saya menghadapi satu hal aneh tetapi secara umum terpotong ...

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
Sergio Kosik
sumber
kata kunci: java.time, Java 8, LocalDateTime.truncatedTo ()
Alexander Taylor
1
Jawaban ini hanya menghasilkan tanggal untuk konteks zona waktu UTC.
Basil Bourque
6

Gunakan DateUtils dari Apache, dengan truncate, seperti ini:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
Byron Marambio Troncoso
sumber
Ini akan terpotong di TimeZone lokal, bukan di UTC yang diwakili oleh Tanggal (getTime).
epox
6

Untuk cap waktu:

timestamp -= timestamp % (24 * 60 * 60 * 1000)
Gan Quan
sumber
3
Ada kesalahan kecil dalam kode ini - tanda kurung kiri tidak ditempatkan dengan benar, itu harus timestamp - = timestamp% (24 * 60 * 60 * 1000). Ini akan memotong bagian waktu. Dan saya yakin cara ini lebih memadai daripada membuat objek Caledar dan bermain dengan metodenya atau bahkan menggunakan pustaka pihak ketiga lainnya
Stan
2
Tidak, ini BUKAN solusi yang tepat, WASPADALAH. Ini sama dengan membulatkan nilai tanggal ke lantai, yaitu - Anda mungkin mendapatkan 28 Maret untuk stempel waktu 29 Maret (di lokasi Anda). Jadi solusi berbasis Kalender (Apache's DateUtils menggunakan Kalender, juga) adalah satu-satunya cara
Drew
Ini juga tidak akan berfungsi ketika waktu berubah karena waktu musim panas.
Alexandru Severin
5

Dari java.util.Date JavaDocs:

Tanggal kelas mewakili waktu instan tertentu, dengan presisi milidetik

dan dari java.sql.Date JavaDocs:

Untuk menyesuaikan dengan definisi SQL DATE, nilai milidetik yang dibungkus oleh instance java.sql.Date harus 'dinormalisasi' dengan menyetel jam, menit, detik, dan milidetik ke nol dalam zona waktu tertentu yang terkait dengan instance tersebut. .

Jadi, pendekatan terbaik adalah menggunakan java.sql.Date jika Anda tidak membutuhkan bagian waktu

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());

dan hasilnya adalah:

java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date  : 2012-04-26
Sunil Manheri
sumber
4

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 ZonedDateTimekelas, lalu konversikan ke LocalDateobjek untuk memanggil atStartOfDaymetodenya. Sadarilah bahwa momen pertama mungkin bukan waktu 00:00:00karena 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 Instantobjek. Baik ZonedDateTimedan Instantakan mewakili momen yang sama di garis waktu tetapi muncul sebagai dua waktu jam dinding yang berbeda .

An Instantadalah 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, Zdi akhir adalah kependekan dari Zuludan 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 .

Basil Bourque
sumber
2

Gunakan metode kelas Kalenderset() untuk menyetel bidang HOUR_OF_DAY, MINUTE, SECONDdan MILLISECONDke nol.

Michael Borgwardt
sumber
2

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 DateTimeobjek di perpustakaan Joda-Time dan panggil withTimeAtStartOfDaymetodenya. Sadarilah bahwa momen pertama mungkin bukan waktu 00:00:00karena Daylight Saving Time atau mungkin anomali lainnya.

Basil Bourque
sumber
Ini adalah jawaban yang pasti (dengan asumsi bahwa seseorang dapat dan ingin menggunakan Waktu Joda)
Clint Eastwood
2

Hanya clear()bidang yang berlebihan.

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();

Dari Java 8 opsi yang lebih baik adalah menggunakan truncatedTometode LocalDateTime, misalnya:

LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)
m190
sumber
Ini tidak berhasil, karena calendar.clear(Calendar.HOUR_OF_DAY);tidak buka jam. Solusi dari @cletus berfungsi dengan baik.
Arcao
Maaf, Anda benar, saya mengoreksinya, selama berjam-jam Anda harus menyetel nilainya. Secara umum caranya hampir sama cara memotong tanggal ...
m190
1

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:

long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);

Saya tidak menggunakan kata "barang" pada saat itu, tetapi kemudian saya menemukan kebahagiaan dari ini:

startTime.set(Calendar.MILLISECOND, 0);

Tapi aku masih kesal.

Dave
sumber
1

Saya memperbaiki masalah seperti ini (di zona delapan Timur (waktu Beijing)):

private Date getTruncatedDate(Date d) {
    if (d == null) {
        return null;
    }
    long h = 60 * 60 * 1000L;
    long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
    return new Date(dateStamp);
}

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:

System.out.println(new Date().getTime());

Dan

System.out.println(new Date(0));

mencetak info waktu yang berbeda dalam zona waktu yang berbeda: Jika Anda menyetel zona waktu pc Anda sebagai UTC, Anda mendapatkan

Thu Jan 01 00:00:00 UTC 1970

Tetapi jika Anda menyetel zona waktu sebagai (UTC +8: 00) Beijing, Chongqing, HongKong, Urumq, Anda mendapatkan:

Thu Jan 01 08:00:00 CST 1970

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.

private Date getTruncatedDate2(Date d) {
    Calendar cal = Calendar.getInstance(); // locale-specific
    cal.setTime(d);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);


return cal.getTime();

}

Gelbert
sumber
FYI, Jawaban ini menggunakan kelas tanggal-waktu lama merepotkan yang digantikan tahun lalu oleh kelas java.time .
Basil Bourque
1

Anda dapat melakukan ini untuk menghindari masalah zona waktu:

public static Date truncDate(Date date) {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTime();
}

Meskipun Dateobjek 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.

GMsoF
sumber
Kelas merepotkan Calendardan Datemenjadi 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.
Basil Bourque
0

Mungkin respons yang terlambat tetapi berikut adalah cara untuk melakukannya dalam satu baris tanpa menggunakan pustaka apa pun:

new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(YOUR_TIMESTAMP))
Alex
sumber
0

Dengan Joda-Time sejak versi 2.0 Anda dapat menggunakan LocalDate.toDate().

Secara sederhana

// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();
lamusique.dll
sumber
[A] Jawaban Anda berlebihan. Sudah diposting oleh Brian Agnew . [B] Kode Anda salah, karena mengabaikan zona waktu, masalah yang paling diangkat dalam pertanyaan.
Basil Bourque
Bisa jadi mubazir tetapi saya hanya memberikan contoh yang lebih sederhana di sini karena saya mengenali jawaban tidak boleh ada dalam komentar. Ya, java.util.Date mengabaikan TimeZone tetapi pertanyaan aslinya adalah dengan a Java Date objectdemikian saya gunakan java.util.Date. Selain itu tidak menjelaskan bagaimana zona waktunya bermasalah dengan java.util.Date (kapan? Dimana?) Meskipun dia tidak bisa membantu menggunakan selain Date.
lamusique
0

Untuk semua jawaban yang menggunakan Kalender, Anda harus menggunakannya seperti ini

public static Date truncateDate(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
    c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
    c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
    c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
    return c.getTime();
}

Tapi saya lebih suka ini:

public static Date truncateDate(Date date) {
    return new java.sql.Date(date.getTime());
}
Tamu
sumber
The java.sql.Datekelas 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.
Basil Bourque
0

Berikut cara sederhana untuk mendapatkan tanggal tanpa waktu jika Anda menggunakan Java 8+: Gunakan tipe java.time.LocalDate, bukan Date.

LocalDate now = LocalDate.now();
 System.out.println(now.toString());

Hasil:

2019-05-30

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

Amy Doxy
sumber
1
Menggunakan LocalDateadalah ide yang bagus untuk sebagian besar tujuan, tetapi tidak jelas bagaimana ini akan bekerja dengan masukan dari pertanyaan 2008-01-01 13:15:00,.
Ole VV