2011-06-29 26 views
19

Giả sử đây là cách bạn có được thời gian hiện tại trong Joda time:Làm thế nào để bạn có được phạm vi ngày/giờ cho "hôm nay" bằng cách sử dụng thư viện ngày/giờ Joda trong Java?

DateTime now = new DateTime(); 

Làm thế nào để bạn tính toán giá trị cho các biến dateTimeAtStartOfTodaydateTimeAtEndOfToday?

Điều tôi đang cố gắng thực hiện là tạo một số SQL để thực hiện tra cứu tất cả các giao dịch đã xảy ra giữa startOfTodayendOfToday.

Trả lời

32

Tôi sẽ sử dụng:

LocalDate today = now.toLocalDate(); 
LocalDate tomorrow = today.plusDays(1); 

DateTime startOfToday = today.toDateTimeAtStartOfDay(now.getZone()); 
DateTime startOfTomorrow = tomorrow.toDateTimeAtStartOfDay(now.getZone()); 

Sau đó kiểm tra nếu startOfToday <= time < startOfTomorrow cho bất kỳ thời gian cụ thể.

Tất nhiên, nó phần nào phụ thuộc vào chính xác những gì được lưu trữ trong cơ sở dữ liệu -. Và những gì múi giờ bạn quan tâm đến

+0

Tôi nghĩ, bạn có lỗi đánh máy trong đó. Bạn sử dụng 'today' hai lần để đọc ngày bắt đầu ... – nfechner

+0

@nfechner: Cố định, cảm ơn. –

+0

Lưu ý việc sử dụng "<=" so với "<" trong mã ở trên trong Câu trả lời này. Điều này được gọi là phương pháp "Nửa mở", trong đó bắt đầu là * bao gồm * trong khi kết thúc là * độc quyền *. Cách tiếp cận này là một cách khôn ngoan để xác định một khoảng thời gian. Ngoài ra, lớp ['Interval'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html) trong Joda-Time có thể được sử dụng để theo dõi cặp đối tượng DateTime được xác định trong mã của Người trả lời này. Lớp Interval sử dụng phương pháp Half-Open khi so sánh ('contains',' overlap', 'gap', &' abuts'). –

0
import org.joda.time.DateTime; 
import org.joda.time.DateTimeMidnight; 

DateTime dateTimeAtStartOfToday = new DateTime(new DateTimeMidnight()); 
DateTime dateTimeAtEndOfToday = new DateTime((new DateTimeMidnight()).plusDays(1)); 
+3

Tôi sẽ đề nghị * không * sử dụng 'DateTimeMidnight' vì có * không phải * luôn luôn là nửa đêm, do thay đổi DST. –

+0

@JonSkeet Tôi chưa bao giờ thấy không có nửa đêm. Không phải lúc nào cũng có 2:00 - 3:00 sáng, nhưng luôn có nửa đêm. Hay đó chỉ là một điều Mỹ? –

+2

@ Bob: Đó chỉ là một điều của Mỹ. Sự thay đổi tiết kiệm ánh sáng ban ngày có thể xảy ra bất cứ lúc nào, theo các quy tắc của địa phương. Tôi phát hiện ra một cách khó khăn. –

0

này hoạt động ...

DateTime dt = new DateTime(); 
DateMidnight dtStartDate = dt.toDateMidnight(); 
DateMidnight dtEndDate = dt.plusDays(1).toDateMidnight(); 
System.out.println(dt + "\n" + dtStartDate + "\n" + dtEndDate); 

... nhưng như xa là SQL, tôi có xu hướng sử dụng BETWEEN làm mệnh đề where chứ không phải là> và < = stuff

+0

Điều này sẽ ném một ngoại lệ nếu một trong hai ngày không chứa nửa đêm do thay đổi DST. toDateTimeAtStartOfDay là IMO tốt hơn. –

+0

Bạn biết đấy, tôi không thể tái tạo ngoại lệ mà bạn nói. Trong quá trình này, làm việc với DateMidnight là tốt hơn tất cả những điều trên vì nó có một phương thức toInterval() để chuyển đổi DST dễ dàng. Tôi đang thêm giải pháp này như là một câu trả lời riêng biệt. –

+1

Tìm múi giờ bị bỏ qua về phía trước vào lúc nửa đêm. IIRC, một nơi nào đó ở Nam Mỹ làm điều đó - như tôi đã phát hiện ra một cách khó khăn ... –

3

Điều này làm việc tốt hơn, hóa ra DateTime có một phương thức gọi là toInterval thực hiện điều này (xem ra nửa đêm đến nửa đêm)). Trong các thử nghiệm của tôi, nó dường như không có vấn đề với quá trình chuyển đổi DST.

DateTime now = new DateTime(); 
DateTime startOfToday = now.toDateMidnight().toInterval().getStart(); 
DateTime endOfToday = now.toDateMidnight().toInterval().getEnd(); 
System.out.println("\n" + now + "\n" + startOfToday + "\n" + endOfToday + "\n"); 

JODA có vẻ được suy nghĩ rất tốt.

+5

NgàyMidnight đã không được chấp nhận (http: //www.joda.org/joda-time/apidocs/org/joda/time/DateMidnight.html) do các vấn đề nửa đêm. Đề xuất là sử dụng phương thức [withTimeAtStartOfDay] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay()) –

1
if((sinceDate.getDayOfYear() == now.getDayOfYear()) && (sinceDate.year() == now.year())) 
    //yep, do something today; 

làm việc cho tôi.

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