2010-08-04 93 views
5

Tôi cần kiểm tra xem ngày cụ thể có sau ngày hôm nay 23:59:59 không, làm cách nào để tạo đối tượng ngày hôm nay là 23:59:59?Ngày hết hạn hôm nay trong Java

+3

Ý của bạn là vào hoặc sau ngày mai vào lúc nửa đêm? Hay bạn quan tâm trong một giây từ 23:59:59 đến 00:00:00? –

Trả lời

3

Sử dụng java.util.Calendar:

Calendar cal = Calendar.getInstance(); // represents right now, i.e. today's date 
cal.set(Calendar.HOUR_OF_DAY, 23); 
cal.set(Calendar.MINUTE, 59); 
cal.set(Calendar.SECOND, 59); 
cal.set(Calendar.MILLISECOND, 999); // credit to f1sh 

Date date = cal.getTime(); 

Tôi nghĩ rằng bạn có thể được tiếp cận từ góc hơi sai, mặc dù. Thay vì cố gắng tạo một phiên bản Date là một nguyên tử trước nửa đêm, cách tiếp cận tốt hơn có thể là tạo Ngày biểu thị nửa đêm và kiểm tra xem thời gian hiện tại có là nghiêm ngặt hơn ít hơn không. Tôi tin rằng điều này sẽ hơi rõ ràng hơn về ý định của bạn cho người khác đọc mã.


Hoặc, bạn có thể sử dụng API ngày của bên thứ ba biết cách chuyển đổi về ngày. API ngày dựng sẵn của Java thường được coi là thiếu theo nhiều cách. Tôi sẽ không khuyên bạn nên sử dụng thư viện khác chỉ để làm điều này, nhưng nếu bạn phải làm rất nhiều thao tác ngày và/hoặc đã sử dụng một thư viện như Joda Time bạn có thể diễn tả khái niệm này đơn giản hơn. Ví dụ: Joda Time có lớp DateMidnight cho phép so sánh dễ dàng hơn nhiều so với ngày "thô" của loại bạn đang làm, không có khả năng xảy ra sự cố tinh tế (như không đặt mili giây trong lần cắt đầu tiên của tôi).

+1

Về 'Calendar.getInstance()': Hãy nhớ rằng 'Lịch' trả về cũng chứa giá trị hiện tại trong mili giây. Tôi không biết điều đó và gần đây tôi đã mất cả ngày để tìm hiểu tại sao 'equals()' luôn luôn trả về sai. – f1sh

+0

Điểm tốt f1sh - có lẽ cách tiếp cận ở đây hơi sai, xem chỉnh sửa sắp tới. –

+0

Chỉ bao gồm: cal.set (Lịch.MILLISECOND, 0); // hoặc 999 –

0

Sử dụng Date.before(Date) hoặc Date.after (ngày)

Calendar c = Calendar.getInstance(); 
c.set(Calendar.HOUR_OF_DAY, 23); 
c.set(Calendar.SECOND, 59); 
c.set(Calendar.MINUTE, 59); 

Date d = c.getTime() 

Date x = // other date from somewhere 

x.after(d); 
0

Tìm ngày mai chuyển đổi nó thành một phần nghìn giây bạn sẽ có được một chặng đường dài giá trị . trừ -1 từ nó và một lần nữa chuyển đổi cho đến nay bạn sẽ nhận được ngày yêu cầu của bạn.

ví dụ: 12:00:00 ngày mai chuyển đổi thành mili giây. bạn sẽ nhận được như một giá trị dài 312313564774 trừ -1 bạn sẽ nhận được thời gian eod ngày hôm nay bằng mili giây

1

Điều này tạo ra một ngày trong tương lai và so sánh nó với ngày hiện tại (đặt đến tối muộn). Bạn nên cân nhắc sử dụng Thư viện thời gian Joda.

long timeStampOfTomorrow = new Date().getTime() + 86400000L; 
Date dateToCheck = new Date(timeStampOfTomorrow); 


Calendar today = Calendar.getInstance(); 
today.set(Calendar.HOUR_OF_DAY, 23); 
today.set(Calendar.MINUTE, 59); 
today.set(Calendar.SECOND, 59); 
today.set(Calendar.MILLISECOND, 999); 

boolean isExpired = dateToCheck.after(today.getTime()); 

Với Thư viện thời gian Joda bạn có thể làm điều này dễ đọc hơn. Một ví dụ dễ dàng có thể được tìm thấy trên project website.

public boolean isRentalOverdue(DateTime datetimeRented) { 
    Period rentalPeriod = new Period().withDays(2).withHours(12); 
    return datetimeRented.plus(rentalPeriod).isBeforeNow(); 
} 
0

Tôi cho rằng bạn có nghĩa là "java.util.Date đã cho sau hôm nay?".

Nếu có, đừng lo lắng về việc xác định thời điểm cuối cùng trong ngày; đó là không thể thực hiện được vì phần thập phân. Tốt hơn là chỉ tập trung vào ngày mà không có thời gian trong ngày. Bạn muốn biết liệu ngày tháng của thời điểm cụ thể có chỉ sau ngày tháng hiện tại của thời điểm hiện tại hay không. Một múi giờ rất quan trọng ở đây.

tl; dr

ZoneId z = ZoneId.of(“America/Montreal”); // Time zone determines date. 
Boolean givenMomentIsAfterToday = myUtilDate.toInstant().atZone(z).toLocalDate().isAfter(LocalDate.now(z)); 

Chi tiết

Bạn đang sử dụng các lớp học ngày thời gian cũ phiền hà hiện thay thế bởi các lớp java.time.

Trước tiên, hãy chuyển đổi số java.util.Date nhất định thành Instant.Tìm các phương thức chuyển đổi mới được thêm vào các lớp cũ để chuyển đổi sang/từ các loại java.time.

Instant

Lớp Instant đại diện cho một thời điểm trên Timeline trong UTC với độ phân giải nanoseconds.

Instant instant = myUtilDate.toInstant(); 

LocalDate

Lớp LocalDate đại diện cho một giá trị ngày tháng chỉ mà không cần thời gian của ngày và không có múi giờ.

Múi giờ rất quan trọng trong việc xác định ngày. Đối với bất kỳ thời điểm cụ thể nào, ngày thay đổi trên toàn cầu theo múi giờ. Ví dụ, một vài phút sau nửa đêm ở Paris Pháp là một ngày mới trong khi vẫn “ngày hôm qua” ở Montréal Québec.

ZoneId z = ZoneId.of(“America/Montreal”); 
LocalDate today = LocalDate.now(z); 

ZonedDateTime

Điều chỉnh ngay lập tức vào cùng múi giờ để so sánh các ngày.

ZonedDateTime zdt = instant.atZone(z); 

Tra cứu giá trị chỉ ngày, LocalDate.

LocalDate ldt = zdt.toLocalDate(); 

Cuối cùng, so sánh các đối tượng LocalDate.

Boolean givenMomentIsAfterToday = ldt.isAfter(today); 

Về java.time

Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ phiền hà cũ như java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển sang java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích.

Hầu hết các chức năng java.time được back-chuyển đến Java 6 & 7 trong ThreeTen-Backport và tiếp tục thích nghi với Android trong ThreeTenABP (xem How to use…).

Dự án ThreeTen-Extra mở rộng java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuarter và hơn thế nữa.

Các vấn đề liên quan