Làm thế nào để có được thời gian bắt đầu và kết thúc của một ngày?


121

Làm thế nào để có được thời gian bắt đầu và kết thúc của một ngày?

mã như thế này không chính xác:

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

Nó không chính xác đến từng mili giây.


8
Ý bạn là nó "không chính xác" là gì?
Kirk Woll

Có gì sai với mã? Những gì bạn nhận được mà bạn không mong đợi? Bạn muốn ngày của mình bắt đầu và kết thúc theo múi giờ nào?
Mark Reed

4
Đoạn mã trên thậm chí không sử dụng ngày được truyền vào phương thức. Nó sẽ được thực hiện: calendar.setTime (ngày) sau khi lịch được tạo.
Jerry Destremps

2
Câu hỏi này giả định các giá trị ngày-giờ có độ phân giải là mili giây. Đúng cho java.util.Date và Joda-Time. Nhưng Sai đối với gói java.time trong Java 8 (nano giây), một số cơ sở dữ liệu như Postgres (micro giây), thư viện unix (toàn bộ giây) và có lẽ những cơ sở dữ liệu khác. Xem câu trả lời của tôi để biết cách tiếp cận an toàn hơn bằng Half-Open.
Basil Bourque,

2
Trên thực tế, bạn sẽ bắt đầu ngày hôm sau và khi lặp lại các mục trong ngày đó (giả sử bạn muốn làm điều đó), bạn sẽ chỉ định giới hạn trên bằng cách sử dụng <thay vì <=. Điều đó sẽ loại trừ ngày hôm sau nhưng bao gồm tất cả ngày hôm trước xuống dưới nano giây.
Daniel F

Câu trả lời:


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.

Bắt đầu ngày mới

Nhận toàn bộ thời lượng của ngày hôm nay như đã thấy trong một múi giờ.

Sử dụng phương pháp Nửa mở, trong đó phần đầu bao gồm trong khi phần cuối là độc quyền . Cách tiếp cận này giải quyết lỗ hổng trong mã của bạn không tính đến giây cuối cùng trong ngày.

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 [Châu Phi / Tunis]

zdtStop.toString () = 2020-01-31T00: 00 + 01: 00 [Châu Phi / Tunis]

Xem những khoảnh khắc tương tự trong UTC.

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

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

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

Nếu bạn muốn cả ngày của một ngày như được thấy ở UTC thay vì theo múi giờ, hãy sử dụng 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

Những OffsetDateTime đối tượng này sẽ ở UTC, nhưng bạn có thể gọi toInstantnếu bạn cần những đối tượng như vậy luôn ở UTC theo định nghĩa.

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

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

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

Mẹo: Bạn có thể quan tâm đến việc thêm thư viện ThreeTen-Extra vào dự án của mình để sử dụng Intervallớp của nó để đại diện cho cặp Instantđối tượng này. Đây lớp Mời các phương pháp hữu ích để so sánh như abuts, overlaps, contains, và nhiều hơn nữa.

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

khoảng thời gian.toString () = 2020-01-29T06: 00: 00Z / 2020-01-30T06: 00: 00Z

Mở một nửa

Câu trả lời của mprivat là chính xác. Quan điểm của anh ấy là đừng cố gắng đạt được kết quả của một ngày, mà hãy so sánh với "trước khi bắt đầu ngày hôm sau". Ý tưởng của ông được biết đến là cách tiếp cận "Nửa mở" trong đó một khoảng thời gian có phần đầu bao hàm trong khi phần kết là độc quyền .

  • Khung ngày-giờ hiện tại của Java (java.util.Date/Calendar và Joda-Time ) đều sử dụng mili giây so với thời đại . Nhưng trong Java 8, các lớp JSR 310 java.time. * Mới sử dụng độ phân giải nano giây. Bất kỳ mã nào bạn đã viết dựa trên việc buộc đếm mili giây của khoảnh khắc cuối cùng trong ngày sẽ không chính xác nếu được chuyển sang các lớp mới.
  • So sánh dữ liệu từ các nguồn khác sẽ bị lỗi nếu chúng sử dụng các độ phân giải khác. Ví dụ: thư viện Unix thường sử dụng toàn bộ giây và cơ sở dữ liệu như Postgres phân giải ngày-thời gian thành micro giây.
  • Một số thay đổi về Giờ tiết kiệm ánh sáng ban ngày xảy ra vào nửa đêm, điều này có thể gây nhầm lẫn thêm cho mọi thứ.

nhập mô tả hình ảnh ở đây

Joda thời gian 2,3 Mời một phương pháp cho mục đích này rất, để có được khoảnh khắc đầu tiên trong ngày: withTimeAtStartOfDay(). Tương tự trong java.time , LocalDate::atStartOfDay.

Tìm kiếm StackOverflow cho "joda nửa mở" để xem thêm các cuộc thảo luận và ví dụ.

Hãy xem bài đăng này, Khoảng thời gian và các phạm vi khác nên để ngỏ , bởi Bill Schneider.

Tránh các lớp ngày-giờ kế thừa

Các lớp java.util.Date và .Calendar nổi tiếng là rắc rối. Tránh chúng.

Sử dụng các lớp java.time . Khung java.time là sự kế thừa chính thức của thư viện Joda-Time rất thành công .

java.time

Khuôn khổ java.time được tích hợp trong Java 8 trở lên. Được chuyển ngược sang Java 6 & 7 trong dự án ThreeTen-Backport , được điều chỉnh thêm cho Android trong dự án ThreeTenABP .

An Instantlà một thời điểm trên dòng thời gian tính theo giờ UTC với độ phân giải là nano giây .

Instant instant = Instant.now();

Áp dụng múi giờ để lấy giờ trên đồng hồ treo tường cho một số địa phương.

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

Để có được khoảnh khắc đầu tiên trong ngày, hãy xem qua LocalDatelớp học và atStartOfDayphương pháp của nó .

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

Sử dụng phương pháp Half-Open, có được khoảnh khắc đầu tiên của ngày hôm sau.

ZonedDateTime zdtTomorrowStart = zdtStart.plusDays( 1 );

Bảng tất cả các kiểu ngày-giờ trong Java, cả hiện đại và kế thừa

Hiện tại, khuôn khổ java.time thiếu một Intervallớp như được mô tả bên dưới cho Joda-Time. Tuy nhiên, dự án ThreeTen-Extra mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có trong tương lai cho java.time. Trong số các lớp của nó là Interval. Xây dựng một Intervalbằng cách truyền một cặp Instantđối tượng. Chúng ta có thể trích xuất một Instanttừ các ZonedDateTimeđối tượng của mình.

Interval today = Interval.of( zdtStart.toInstant() , zdtTomorrowStart.toInstant() );

Giới thiệu về java.time

Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow để có nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.

Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của mình. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*lớp. Hibernate 5 & JPA 2.2 hỗ trợ java.time .

Lấy các lớp java.time ở đâu?


Joda-Time

CẬP NHẬT: Dự án Joda-Time hiện đang ở chế độ bảo trì và khuyên bạn nên chuyển sang các lớp java.time . Tôi để phần này nguyên vẹn cho lịch sử.

Joda thời gian có ba lớp học để đại diện cho một khoảng thời gian theo nhiều cách khác nhau: Interval, Period, và Duration. An Intervalcó một khởi đầu và kết thúc cụ thể trên dòng thời gian của Vũ trụ. Điều này phù hợp với nhu cầu của chúng tôi để đại diện cho "một ngày".

Chúng tôi gọi phương thức withTimeAtStartOfDaythay vì đặt thời gian trong ngày thành số không. Do Giờ tiết kiệm ánh sáng ban ngày và những điều bất thường khác, khoảnh khắc đầu tiên trong ngày có thể không như vậy 00:00:00.

Mã ví dụ sử dụng 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 );

Nếu phải, bạn có thể chuyển đổi sang java.util.Date.

java.util.Date date = todayStart.toDate();

Tôi cần sử dụngLocalDateTime
user924

170

Java 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());
}

Cập nhật : Tôi đã thêm 2 phương thức này vào Lớp tiện ích Java của mình tại đây

Nó nằm trong Maven Central Repository tại:

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

Java 7 trở về trước


Với 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);
}

Không có 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();
}

5
Tôi khuyên bạn không nên làm theo cách này vì những vấn đề phức tạp mà bạn sẽ gặp phải về múi giờ, tiết kiệm ánh sáng ban ngày, v.v. mà thư viện thời gian như Joda sẽ giải quyết cho bạn.
Edward Anderson

7
Tôi nghĩ getStartOfDayphải là: LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);Tức là LocalTime, không phải LocalDateTime.
Konstantin Kulagin

Đừng nghĩ những điều đó getEndOfDay(Date date). getStartOfDay(Date date)các phương thức trong phần Java 8 là đúng, cụ thể là LocalDateTime.MAX và .MIN cho bạn biết ngày sớm nhất có thể trong quá khứ và tương lai, không phải ngày bắt đầu và kết thúc của một ngày. Thay vào đó, tôi đề xuất .atStartOfDay () cho bắt đầu và .plusDays (1) .atStartOfDay (). TrừNanos (1) cho kết thúc.
Glen Mazza

Phương pháp localDateTimeToDate(LocalDateTime startOfDay)throws Exception - java.lang.IllegalArgumentException: java.lang.ArithmeticException: tràn dài
sanluck

1
@GlenMazza giải pháp Java 8 sử dụng localtime MAX , không LocalDateTime.MAX . Giải pháp là chính xác.
Frederico Pantuzza,

28

trong getEndOfDay, bạn có thể thêm:

calendar.set(Calendar.MILLISECOND, 999);

Mặc dù nói về mặt toán học, bạn không thể xác định thời điểm kết thúc của một ngày ngoài việc nói rằng đó là "trước đầu ngày hôm sau".

Vì vậy, thay vì nói, if(date >= getStartOfDay(today) && date <= getEndOfDay(today))thì bạn nên nói: if(date >= getStartOfDay(today) && date < getStartOfDay(tomorrow)). Đó là một định nghĩa chắc chắn hơn nhiều (và bạn không phải lo lắng về độ chính xác mili giây).


1
Nửa sau câu trả lời này là cách tốt nhất. Cách tiếp cận này được gọi là "Half-Open". Tôi giải thích thêm trong câu trả lời của tôi .
Basil Bourque vào

14

java.time

Sử dụng java.timekhung được tích hợp trong 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

3
Câu trả lời này bỏ qua các điểm bất thường như Giờ tiết kiệm ánh sáng ban ngày (DST). Các Local…lớp không có khái niệm về múi giờ và điều chỉnh các dị thường. Ví dụ: một số múi giờ có DST thay đổi vào lúc nửa đêm, vì vậy thời điểm đầu tiên trong ngày là tại thời điểm 01:00:00.0(1 giờ sáng) chứ không phải 00:00:00.0giá trị do mã này tạo ra. Sử dụng ZonedDateTimethay thế.
Basil Bourque

4

Cách bổ sung để tìm bắt đầu ngày mới với java8 java.time.ZonedDateTime thay vì đi qua LocalDateTimechỉ đơn giản là cắt bớt đầu vào ZonedDateTime thành DAYS:

zonedDateTimeInstance.truncatedTo( ChronoUnit.DAYS );

2

Đối với java 8, các câu lệnh dòng đơn sau đang hoạt động. Trong ví dụ này, tôi sử dụng múi giờ UTC. Hãy cân nhắc để thay đổi TimeZone mà bạn hiện đang sử dụng.

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);

Nếu không chênh lệch múi giờ với sản lượng. Thử:ZoneOffset.ofHours(0)


1
Làm thế nào để điều này thêm giá trị ngoài các Câu trả lời hiện có? Ngoài ra, bạn bỏ qua vấn đề cốt yếu là múi giờ. Và việc chuyển hằng số UTC tới toInstantlà cú pháp không hợp lệ và dư thừa về mặt khái niệm.
Basil Bourque vào

@BasilBourque "Làm thế nào để điều này thêm giá trị ngoài các Câu trả lời hiện có?" Đây là cách hoạt động của stackoverflow. BTW đây chỉ là một mẫu. Mọi người có thể thay đổi theo cách họ muốn. chuyển UTC sang toInstant là hoàn toàn hợp pháp, bạn có thể kiểm tra kết quả đầu ra.
Fırat KÜÇÜK

2

Java 8 hoặc 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

Tôi hy vọng rằng sẽ giúp một ai đó.


Phương pháp "atTime" là một cách tiếp cận rất tốt với hằng số "LocalTime.MAX" cho cuối ngày. Đẹp!
Ông Anderson

2

Tôi đã thử mã này và nó hoạt động tốt!

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);

Nếu bạn có ZonedDateTimeInstanttheo ý của bạn thì không cần sử dụng java.sql.Timestampnữa. Lớp đó là một trong những lớp kế thừa cũ khủng khiếp hiện được thay thế bởi các lớp java.time . Kể từ JDBC 4.2, chúng ta có thể trao đổi trực tiếp các đối tượng java.time với cơ sở dữ liệu. Sự pha trộn giữa các lớp kế thừa và hiện đại của bạn không có ý nghĩa gì đối với tôi.
Basil Bourque

1

Một giải pháp khác không phụ thuộc vào bất kỳ khuôn khổ nào là:

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);
}

Lưu ý rằng nó trả về thời gian dựa trên UTC


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); cung cấp cho bạn độ chính xác lên đến mili giây


1
Các lớp date-time khủng khiếp này đã được thay thế nhiều năm trước bởi các lớp java.time hiện đại được định nghĩa trong JSR 310.
Basil Bourque

@BasilBourque gói java.time chỉ xuất hiện trong Java 8, chỉ có sẵn kể từ Android N (API 26)
ivan8m8

@ ivan8m8 Hầu hết chức năng của java.time được chuyển ngược sang Java 6 & 7 trong thư viện ThreeTen-Backport . Được điều chỉnh thêm cho Android đời đầu (<26) trong thư viện ThreeTenABP .
Basil Bourque

@BasilBourque nhưng ThreeTen sử dụng một cơ chế cực kỳ kém hiệu quả trên Android .
ivan8m8

@ ivan8m8 Có thể bạn đang nghĩ đến tiền thân của java.time , Joda-Time . Một lần nữa, hãy xem dự án ThreeTenABP . Tôi chưa nghe nói về sự kém hiệu quả như vậy trên Android khi sử dụng thư viện đó.
Basil Bourque

0

Tôi biết là hơi muộn, nhưng trong trường hợp của Java 8, nếu bạn đang sử dụng OffsetDateTime (cung cấp rất nhiều lợi thế, chẳng hạn như TimeZone, Nanoseconds, v.v.), bạn có thể sử dụng mã sau:

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

0

Tôi gặp một số bất tiện với tất cả các giải pháp vì tôi cần loại Biến tức thời và Múi giờ luôn can thiệp vào việc thay đổi mọi thứ, sau đó kết hợp các giải pháp, tôi thấy rằng đây là một lựa chọn tốt.

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

và kết quả là chúng tôi có

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

Tôi hy vọng nó sẽ giúp bạn


Ngày thực sự kết thúc vào sự xuất hiện của giây phút đầu tiên của sau ngày. Mã của bạn bỏ qua trong một giây đầy đủ cuối cùng của một ngày, một tỷ nano giây không bao giờ được báo cáo. Xem Câu trả lời của tôi để tìm hiểu về cách tiếp cận Nửa mở để xác định khoảng thời gian.
Basil Bourque vào

Thao tác chuỗi như một cách xử lý các giá trị ngày-giờ nói chung là một cách tiếp cận kém. Sử dụng các đối tượng thông minh thay vì các chuỗi câm cho công việc này. Các lớp java.time cung cấp tất cả các chức năng bạn cần cho vấn đề này mà không cần dùng đến thao tác chuỗi.
Basil Bourque vào

Tôi vừa mới thêm phần tl; dr vào Câu trả lời của mình để chỉ ra cách lấy phạm vi một ngày dưới dạng một cặp Instantđối tượng. Mẹo: bạn có thể quan tâm đến việc thêm thư viện ThreeTen-Extra vào dự án của mình để sử dụng Intervallớp của nó .
Basil Bourque vào

0

Tôi nghĩ cách dễ nhất sẽ là:

// Joda Time

DateTime dateTime=new DateTime(); 

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

Những mili này sau đó có thể được chuyển đổi thành Lịch, Ngày tức thì hoặc Ngày địa phương theo yêu cầu của bạn với Joda Time.


-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();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.