Bagaimana cara mendapatkan waktu mulai dan waktu akhir suatu hari?

121

Bagaimana cara mendapatkan waktu mulai dan waktu akhir suatu hari?

kode seperti ini tidak akurat:

 private Date getStartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.set(year, month, day, 0, 0, 0);
    return calendar.getTime();
}

private Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.set(year, month, day, 23, 59, 59);
    return calendar.getTime();
}

Ini tidak akurat untuk milidetik.

kalman03
sumber
8
Apa maksudmu itu "tidak akurat"?
Kirk Woll
Ada apa dengan kodenya? Apa yang Anda dapatkan yang tidak Anda harapkan? Pada zona waktu apa Anda ingin hari-hari Anda dimulai dan diakhiri?
Mark Reed
4
Kode di atas bahkan tidak menggunakan tanggal yang diteruskan ke dalam metode. Seharusnya melakukan: calendar.setTime (date) setelah kalender dibuat.
Jerry Destremps
2
Pertanyaan ini mengasumsikan nilai tanggal-waktu memiliki resolusi milidetik. Benar untuk java.util.Date dan Joda-Time. Tetapi Salah untuk paket java.time di Java 8 (nanodetik), beberapa database seperti Postgres (mikrodetik), perpustakaan unix (seluruh detik), dan mungkin lainnya. Lihat jawaban saya untuk pendekatan yang lebih aman menggunakan Half-Open.
Basil Bourque
2
Sebenarnya Anda harus mendapatkan permulaan hari berikutnya dan ketika mengulang item pada hari itu (dengan asumsi Anda ingin melakukan itu) Anda akan menentukan batas atas dengan menggunakan <bukannya <=. Itu akan mengecualikan hari berikutnya tetapi mencakup semua hari sebelumnya hingga nanodetik.
Daniel F

Jawaban:

115

tl; dr

LocalDate                       // Represents an entire day, without time-of-day and without time zone.
.now(                           // Capture the current date.
    ZoneId.of( "Asia/Tokyo" )   // Returns a `ZoneId` object.
)                               // Returns a `LocalDate` object.
.atStartOfDay(                  // Determines the first moment of the day as seen on that date in that time zone. Not all days start at 00:00!
    ZoneId.of( "Asia/Tokyo" ) 
)                               // Returns a `ZonedDateTime` object.

Awal hari

Dapatkan durasi penuh hari ini seperti yang terlihat pada zona waktu.

Menggunakan pendekatan Setengah Terbuka, di mana bagian awal bersifat inklusif sedangkan bagian akhir bersifat eksklusif . Pendekatan ini memecahkan kesalahan dalam kode Anda yang gagal memperhitungkan detik-detik terakhir hari itu.

ZoneId zoneId = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( zoneId  ) ;

ZonedDateTime zdtStart = today.atStartOfDay( zoneId ) ;
ZonedDateTime zdtStop = today.plusDays( 1 ).atStartOfDay( zoneId ) ;

zdtStart.toString () = 2020-01-30T00: 00 + 01: 00 [Afrika / Tunis]

zdtStop.toString () = 2020-01-31T00: 00 + 01: 00 [Afrika / Tunis]

Lihat momen yang sama di UTC.

Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;

start.toString () = 2020-01-29T23: 00: 00Z

stop.toString () = 2020-01-30T23: 00: 00Z

Jika Anda menginginkan seluruh hari dalam suatu tanggal seperti yang terlihat di UTC daripada dalam zona waktu, gunakan OffsetDateTime.

LocalDate today = LocalDate.now( ZoneOffset.UTC  ) ;

OffsetDateTime odtStart = today.atTime( OffsetTime.MIN ) ;
OffsetDateTime odtStop = today.plusDays( 1 ).atTime( OffsetTime.MIN ) ;

odtStart.toString () = 2020-01-30T00: 00 + 18: 00

odtStop.toString () = 2020-01-31T00: 00 + 18: 00

Ini OffsetDateTime benda-benda yang sudah akan berada di UTC, tetapi Anda dapat menghubungi toInstantjika Anda membutuhkan objek seperti yang selalu di UTC dengan definisi.

Instant start = odtStart.toInstant() ;
Instant stop = odtStop.toInstant() ;

start.toString () = 2020-01-29T06: 00: 00Z

stop.toString () = 2020-01-30T06: 00: 00Z

Tip: Anda mungkin tertarik untuk menambahkan pustaka ThreeTen-Extra ke proyek Anda untuk menggunakan Intervalkelasnya untuk mewakili pasangan Instantobjek ini. Ini menawarkan kelas metode yang berguna untuk perbandingan seperti abuts, overlaps, contains, dan banyak lagi.

Interval interval = Interval.of( start , stop ) ;

interval.toString () = 2020-01-29T06: 00: 00Z / 2020-01-30T06: 00: 00Z

Setengah Terbuka

The jawaban dengan mprivat benar. Maksudnya adalah untuk tidak mencoba mendapatkan akhir hari, tetapi membandingkan dengan "sebelum memulai hari berikutnya". Idenya dikenal sebagai pendekatan "Setengah Terbuka" di mana suatu rentang waktu memiliki awal yang inklusif sedangkan akhir bersifat eksklusif .

  • Kerangka kerja tanggal-waktu Java (java.util.Date/Calendar dan Joda-Time ) keduanya menggunakan milidetik dari epoch . Namun di Java 8, kelas java.time. * JSR 310 yang baru menggunakan resolusi nanodetik. Kode apa pun yang Anda tulis berdasarkan pemaksaan hitungan milidetik saat terakhir hari akan salah jika dialihkan ke kelas baru.
  • Membandingkan data dari sumber lain menjadi salah jika mereka menggunakan resolusi lain. Misalnya, pustaka Unix biasanya menggunakan seluruh detik, dan database seperti Postgres menyelesaikan tanggal-waktu menjadi mikrodetik.
  • Beberapa perubahan Waktu Musim Panas terjadi selama tengah malam yang selanjutnya dapat membingungkan banyak hal.

masukkan deskripsi gambar di sini

Joda-Time 2.3 menawarkan metode untuk tujuan ini, untuk mendapatkan momen pertama hari: withTimeAtStartOfDay(). Demikian pula di java.time LocalDate::atStartOfDay,.

Telusuri StackOverflow untuk "joda setengah terbuka" untuk melihat lebih banyak diskusi dan contoh.

Lihat posting ini, Interval waktu dan rentang lainnya harus setengah terbuka , oleh Bill Schneider.

Hindari kelas tanggal-waktu lama

Kelas java.util.Date dan .Calendar terkenal merepotkan. Hindari mereka.

Gunakan kelas java.time . The java.time kerangka adalah penerus resmi yang sangat sukses Joda-Time perpustakaan.

java.time

Framework java.time dibangun di Java 8 dan yang lebih baru. Porting kembali ke Java 6 & 7 dalam proyek ThreeTen-Backport , selanjutnya diadaptasi ke Android dalam proyek ThreeTenABP .

Sebuah Instantmomen di timeline dalam UTC dengan resolusi nanodetik .

Instant instant = Instant.now();

Terapkan zona waktu untuk mendapatkan waktu jam dinding di beberapa wilayah.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Untuk mendapatkan momen pertama hari itu, ikuti LocalDatekelas dan atStartOfDaymetodenya.

ZonedDateTime zdtStart = zdt.toLocalDate().atStartOfDay( zoneId );

Dengan menggunakan pendekatan Setengah Terbuka, dapatkan momen pertama di hari berikutnya.

ZonedDateTime zdtTomorrowStart = zdtStart.plusDays( 1 );

Tabel semua jenis tanggal-waktu di Jawa, baik modern maupun lawas

Saat ini framework java.time tidak memiliki Intervalkelas seperti yang dijelaskan di bawah ini untuk Joda-Time. Namun, proyek ThreeTen-Extra memperluas java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan java.time di masa mendatang. Di antara kelasnya adalah Interval. Bangun Intervaldengan melewatkan sepasang Instantbenda. Kita dapat mengekstrak Instantdari ZonedDateTimeobjek kita .

Interval today = Interval.of( zdtStart.toInstant() , zdtTomorrowStart.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.

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .

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. Hibernate 5 & JPA 2.2 mendukung java.time .

Di mana mendapatkan kelas java.time?


Waktu Joda

UPDATE: Proyek Joda-Time sekarang dalam mode pemeliharaan, dan menyarankan migrasi ke kelas java.time . Saya meninggalkan bagian ini utuh untuk sejarah.

Joda-Time memiliki tiga kelas untuk mewakili rentang waktu dalam berbagai cara: Interval, Period, dan Duration. An Intervalmemiliki awal dan akhir yang spesifik pada garis waktu Semesta. Ini sesuai dengan kebutuhan kita untuk mewakili "satu hari".

Kami memanggil metode withTimeAtStartOfDaydaripada menyetel waktu hari ke nol. Karena Waktu Musim Panas dan anomali lainnya, momen pertama hari itu mungkin tidak terjadi 00:00:00.

Contoh kode menggunakan Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( timeZone );
DateTime todayStart = now.withTimeAtStartOfDay();
DateTime tomorrowStart = now.plusDays( 1 ).withTimeAtStartOfDay();
Interval today = new Interval( todayStart, tomorrowStart );

Jika harus, Anda dapat mengonversi ke java.util.Date.

java.util.Date date = todayStart.toDate();
Basil Bourque
sumber
Saya perlu menggunakanLocalDateTime
user924
170

Jawa 8


public static Date atStartOfDay(Date date) {
    LocalDateTime localDateTime = dateToLocalDateTime(date);
    LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);
    return localDateTimeToDate(startOfDay);
}

public static Date atEndOfDay(Date date) {
    LocalDateTime localDateTime = dateToLocalDateTime(date);
    LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
    return localDateTimeToDate(endOfDay);
}

private static LocalDateTime dateToLocalDateTime(Date date) {
    return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}

private static Date localDateTimeToDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}

Pembaruan : Saya telah menambahkan 2 metode ini ke Kelas Utilitas Java saya di sini

Itu ada di Repositori Pusat Maven di:

<dependency>
  <groupId>com.github.rkumsher</groupId>
  <artifactId>utils</artifactId>
  <version>1.3</version>
</dependency>

Java 7 dan Sebelumnya


Dengan Apache Commons

public static Date atEndOfDay(Date date) {
    return DateUtils.addMilliseconds(DateUtils.ceiling(date, Calendar.DATE), -1);
}

public static Date atStartOfDay(Date date) {
    return DateUtils.truncate(date, Calendar.DATE);
}

Tanpa Apache Commons

public Date atEndOfDay(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();
}

public Date atStartOfDay(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();
}
RKumsher
sumber
5
Saya merekomendasikan untuk tidak menggunakan pendekatan ini karena masalah kasus tepi yang akan Anda hadapi dengan zona waktu, penghematan siang hari, dll. Yang akan ditangani oleh perpustakaan waktu seperti Joda untuk Anda.
Edward Anderson
7
Saya pikir getStartOfDayharus: LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);Ie LocalTime, bukan LocalDateTime.
Konstantin Kulagin
Jangan pikirkan itu getEndOfDay(Date date). getStartOfDay(Date date)metode di bagian Java 8 sudah benar, yaitu LocalDateTime.MAX dan .MIN menempatkan Anda pada tanggal sedini mungkin di masa lalu dan masa depan, bukan awal dan akhir hari. Sebaliknya saya akan menyarankan .atStartOfDay () untuk memulai dan .plusDays (1) .atStartOfDay (). MinusNanos (1) untuk akhir.
Glen Mazza
Metode localDateTimeToDate(LocalDateTime startOfDay)melempar Exception - java.lang.IllegalArgumentException: java.lang.ArithmeticException: long overflow
sanluck
1
@GlenMazza solusi Java 8 menggunakan localtime Maks , tidak LocalDateTime.MAX . Solusinya benar.
Frederico Pantuzza
28

di getEndOfDay, Anda dapat menambahkan:

calendar.set(Calendar.MILLISECOND, 999);

Meskipun secara matematis, Anda tidak dapat menentukan akhir hari selain dengan mengatakan "sebelum permulaan hari berikutnya".

Jadi, bukannya mengatakan, if(date >= getStartOfDay(today) && date <= getEndOfDay(today)), Anda harus mengatakan: if(date >= getStartOfDay(today) && date < getStartOfDay(tomorrow)). Itu adalah definisi yang jauh lebih solid (dan Anda tidak perlu khawatir tentang presisi milidetik).

mprivat.dll
sumber
1
Paruh kedua dari jawaban ini adalah cara terbaik. Pendekatan ini dikenal sebagai "Setengah Terbuka". Saya jelaskan lebih lanjut dalam jawaban saya .
Basil Bourque
14

java.time

Menggunakan java.timekerangka kerja bawaan Java 8.

import java.time.LocalTime;
import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); // 2015-11-19T19:42:19.224
// start of a day
now.with(LocalTime.MIN); // 2015-11-19T00:00
now.with(LocalTime.MIDNIGHT); // 2015-11-19T00:00
// end of a day
now.with(LocalTime.MAX); // 2015-11-19T23:59:59.999999999
Przemek
sumber
3
Jawaban ini mengabaikan anomali seperti Daylight Saving Time (DST). The Local…kelas tidak memiliki konsep zona waktu dan menyesuaikan untuk anomali. Misalnya, beberapa zona waktu memiliki perubahan DST pada tengah malam, jadi momen pertama hari itu adalah pada waktu 01:00:00.0(1 pagi) daripada 00:00:00.0nilai yang dihasilkan oleh kode ini. Gunakan ZonedDateTimesebagai gantinya.
Basil Bourque
4

Cara tambahan untuk menemukan awal hari dengan java8 java.time.ZonedDateTime alih-alih melalui LocalDateTimehanya memotong input ZonedDateTime ke DAYS:

zonedDateTimeInstance.truncatedTo( ChronoUnit.DAYS );
laur
sumber
2

Untuk java 8, pernyataan satu baris berikut berfungsi. Dalam contoh ini saya menggunakan zona waktu UTC. Harap pertimbangkan untuk mengubah TimeZone yang saat ini Anda gunakan.

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

final LocalDateTime endOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
final Date          endOfDayAsDate = Date.from(endOfDay.toInstant(ZoneOffset.UTC));

System.out.println(endOfDayAsDate);

final LocalDateTime startOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
final Date          startOfDayAsDate = Date.from(startOfDay.toInstant(ZoneOffset.UTC));

System.out.println(startOfDayAsDate);

Jika tidak ada perbedaan waktu dengan output. Mencoba:ZoneOffset.ofHours(0)

Fırat KÜÇÜK
sumber
1
Bagaimana ini menambah nilai di luar Answers yang ada? Juga, Anda mengabaikan masalah zona waktu yang krusial. Dan meneruskan konstanta UTC ke toInstantadalah sintaks yang ilegal dan berlebihan secara konseptual.
Basil Bourque
@BasilBourque "Bagaimana ini menambah nilai di luar Answers yang ada?" Beginilah cara kerja stackoverflow. BTW ini hanya template. Orang bisa berubah dengan cara yang mereka inginkan. meneruskan UTC ke toInstant benar-benar legal, Anda dapat memeriksa hasilnya.
Fırat KÜÇÜK
2

Java 8 atau ThreeTenABP

ZonedDateTime

ZonedDateTime curDate = ZonedDateTime.now();

public ZonedDateTime startOfDay() {
    return curDate
    .toLocalDate()
    .atStartOfDay()
    .atZone(curDate.getZone())
    .withEarlierOffsetAtOverlap();
}

public ZonedDateTime endOfDay() {

    ZonedDateTime startOfTomorrow =
        curDate
        .toLocalDate()
        .plusDays(1)
        .atStartOfDay()
        .atZone(curDate.getZone())
        .withEarlierOffsetAtOverlap();

    return startOfTomorrow.minusSeconds(1);
}

// based on https://stackoverflow.com/a/29145886/1658268

LocalDateTime

LocalDateTime curDate = LocalDateTime.now();

public LocalDateTime startOfDay() {
    return curDate.atStartOfDay();
}

public LocalDateTime endOfDay() {
    return startOfTomorrow.atTime(LocalTime.MAX);  //23:59:59.999999999;
}

// based on https://stackoverflow.com/a/36408726/1658268

Saya harap itu membantu seseorang.

SudoPlz
sumber
Metode "atTime" adalah pendekatan togheter yang sangat baik dengan konstanta "LocalTime.MAX" untuk akhir hari. Bagus!
Tn. Anderson
2

Saya mencoba kode ini dan berhasil dengan baik!

final ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
final ZonedDateTime startofDay =
    now.toLocalDate().atStartOfDay(ZoneOffset.UTC);
final ZonedDateTime endOfDay =
    now.toLocalDate().atTime(LocalTime.MAX).atZone(ZoneOffset.UTC);
Siddhey Sankhe
sumber
Jika Anda memiliki ZonedDateTimedan Instantsiap membantu Anda tidak perlu menggunakan java.sql.Timestamp. Kelas itu adalah salah satu kelas lama yang mengerikan sekarang digantikan oleh kelas java.time . Pada JDBC 4.2, kita bisa langsung bertukar objek java.time dengan database. Campuran Anda antara kelas warisan dan kelas modern tidak masuk akal bagi saya.
Basil Bourque
1

Solusi lain yang tidak bergantung pada kerangka kerja apa pun adalah:

static public Date getStartOfADay(Date day) {
    final long oneDayInMillis = 24 * 60 * 60 * 1000;
    return new Date(day.getTime() / oneDayInMillis * oneDayInMillis);
}

static public Date getEndOfADay(Date day) {
    final long oneDayInMillis = 24 * 60 * 60 * 1000;
    return new Date((day.getTime() / oneDayInMillis + 1) * oneDayInMillis - 1);
}

Perhatikan bahwa ini mengembalikan waktu berbasis UTC

Alexander Chingarev
sumber
1
private Date getStartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.setTimeInMillis(0);
    calendar.set(year, month, day, 0, 0, 0);
    return calendar.getTime();
    }

private Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.setTimeInMillis(0);
    calendar.set(year, month, day, 23, 59, 59);
    return calendar.getTime();
    }

calendar.setTimeInMillis (0); memberi Anda akurasi hingga milidetik

manik venkat
sumber
1
Kelas tanggal-waktu yang mengerikan ini bertahun-tahun yang lalu digantikan oleh kelas java.time modern yang ditentukan di JSR 310.
Basil Bourque
@BasilBourque paket java.time hanya muncul di Java 8 yang hanya tersedia sejak Android N (API 26)
ivan8m8
@ ivan8m8 Sebagian besar fungsionalitas java.time di -back-port ke Java 6 & 7 di pustaka ThreeTen-Backport . Diadaptasi lebih lanjut untuk Android awal (<26) di pustaka ThreeTenABP .
Basil Bourque
@BasilBourque tetapi ThreeTen menggunakan mekanisme yang sangat tidak efisien di Android .
ivan8m8
@ ivan8m8 Anda mungkin berpikir tentang pendahulu java.time , Joda-Time . Sekali lagi, lihat proyek ThreeTenABP . Saya belum pernah mendengar tentang ketidakefisienan di Android menggunakan pustaka itu.
Basil Bourque
0

Saya tahu ini agak terlambat, tetapi dalam kasus Java 8, jika Anda menggunakan OffsetDateTime (yang menawarkan banyak keuntungan, seperti TimeZone, Nanoseconds, dll.), Anda dapat menggunakan kode berikut:

OffsetDateTime reallyEndOfDay = someDay.withHour(23).withMinute(59).withSecond(59).withNano(999999999);
// output: 2019-01-10T23:59:59.999999999Z
Florin
sumber
0

Saya mengalami beberapa ketidaknyamanan dengan semua solusi karena saya membutuhkan jenis variabel Instan dan Zona Waktu selalu mengganggu perubahan segalanya, kemudian menggabungkan solusi. Saya melihat bahwa ini adalah pilihan yang baik.

        LocalDate today = LocalDate.now();
        Instant startDate = Instant.parse(today.toString()+"T00:00:00Z");
        Instant endDate = Instant.parse(today.toString()+"T23:59:59Z");

dan kami mendapatkan hasilnya

        startDate = 2020-01-30T00:00:00Z
        endDate = 2020-01-30T23:59:59Z

Saya harap ini membantu Anda

yOshi
sumber
Hari itu sebenarnya berakhir pada saat tibanya momen pertama di hari berikutnya . Kode Anda melompati detik penuh terakhir dalam sehari, satu miliar nanodetik yang tidak pernah dilaporkan. Lihat Jawaban saya untuk mempelajari tentang pendekatan Setengah Terbuka untuk menentukan rentang waktu.
Basil Bourque
Memanipulasi string sebagai cara menangani nilai tanggal-waktu umumnya merupakan pendekatan yang buruk. Gunakan objek pintar daripada string bodoh untuk pekerjaan ini. The java.time kelas memberikan semua fungsi yang Anda butuhkan untuk masalah ini tanpa menggunakan manipulasi string.
Basil Bourque
Saya baru saja menambahkan bagian tl; dr ke Jawaban saya yang menunjukkan bagaimana mendapatkan rentang hari sebagai sepasang Instantobjek. Tip: Anda mungkin tertarik untuk menambahkan perpustakaan ThreeTen-Extra ke proyek Anda untuk menggunakan Intervalkelasnya.
Basil Bourque
0

Saya pikir yang paling mudah adalah seperti ini:

// Joda Time

DateTime dateTime=new DateTime(); 

StartOfDayMillis = dateTime.withMillis(System.currentTimeMillis()).withTimeAtStartOfDay().getMillis();
EndOfDayMillis = dateTime.withMillis(StartOfDayMillis).plusDays(1).minusSeconds(1).getMillis();

Milidetik ini kemudian dapat diubah menjadi Kalender, Instan, atau Tanggal Lokal sesuai kebutuhan Anda dengan Joda Time.

happyvirus
sumber
-2
public static Date beginOfDay(Date 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);

    return cal.getTime();
}

public static Date endOfDay(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 23);
    cal.set(Calendar.MINUTE, 59);
    cal.set(Calendar.SECOND, 59);
    cal.set(Calendar.MILLISECOND, 999);

    return cal.getTime();
}
jack jin
sumber