2016-02-04 21 views
5

Vui lòng đề xuất nếu có hỗ trợ API để xác định xem thời gian của tôi có nằm trong khoảng từ 2 LocalTime trường hợp hay đề xuất một cách tiếp cận khác.giữa java.time.LocalTime (ngày hôm sau)

tôi có tổ chức này:

class Place { 
    LocalTime startDay; 
    LocalTime endDay; 
} 

mà các cửa hàng bắt đầu ngày và kết thúc thời gian làm việc, tức là từ '09:00' đến '17: 00' , hoặc một hộp đêm từ '22: 00' đến "5:00".

Tôi cần triển khai phương thức Place.isOpen() xác định xem địa điểm có mở cửa tại một thời điểm nhất định hay không.

Một đơn giản isBefore/isAfter không hoạt động tại đây, bởi vì chúng tôi cũng cần xác định xem thời gian kết thúc có vào ngày hôm sau hay không.

Tất nhiên, chúng ta có thể so sánh thời gian bắt đầu và kết thúc và đưa ra quyết định, nhưng tôi muốn điều gì đó không có logic bổ sung, chỉ cần gọi between() đơn giản. Nếu LocalTime không đủ cho mục đích này, vui lòng đề xuất mục đích khác.

+4

bài viết một cái gì đó mà bạn đã cố gắng. Làm thế nào để bạn nghĩ rằng bạn sẽ xử lý các trường hợp mà thời gian đóng cửa là "trước" (mà không xem xét ngày) thời gian mở cửa? – Tunaki

+1

"Tất nhiên, chúng ta có thể so sánh hai lần, và đưa ra quyết định, nhưng tôi không nghĩ rằng điều này là tốt đẹp." Tại sao bạn nghĩ rằng? Bạn đang tìm kiếm giải pháp gì? Xác định "cách tốt đẹp". – Tunaki

Trả lời

7

Nếu tôi hiểu chính xác, bạn cần phải thực hiện hai trường hợp tùy thuộc vào việc thời gian đóng cửa có cùng ngày với thời gian mở cửa (9-17) hoặc vào ngày hôm sau (22-5) hay không.

Nó chỉ đơn giản có thể là:

public static boolean isOpen(LocalTime start, LocalTime end, LocalTime time) { 
    if (start.isAfter(end)) { 
    return !time.isBefore(start) || !time.isAfter(end); 
    } else { 
    return !time.isBefore(start) && !time.isAfter(end); 
    } 
} 
+0

Cảm ơn bạn, đây là những gì tôi đã kết thúc với. Tuy nhiên điều này có vẻ giống như một usecase phổ biến, và tôi đã tự hỏi nếu có bất kỳ sự hỗ trợ từ API. Hoặc có thể một số cấu trúc có thể lưu trữ thêm ngày đó, để chỉ thực hiện một so sánh tại một thời điểm. Nhưng nếu phát hiện ra, điều này sẽ không hoạt động, vì bạn cần phải xác định điều này 'ngày hôm sau' điều trên thời gian đầu vào là tốt. Cuộc sống là đau :) Tôi sẽ đánh dấu câu trả lời của bạn là giải pháp. –

+1

Tôi không nghĩ rằng có một cách đơn giản hơn. – assylias

+0

Cảm ơn bạn đã chỉnh sửa. –

0

này trông sạch hơn cho tôi:

if (start.isBefore(end)) { 
    return start.isBefore(date.toLocalTime()) && end.isAfter(date.toLocalTime()); 
} else { 
    return date.toLocalTime().isAfter(start) || date.toLocalTime().isBefore(end); 
} 
Các vấn đề liên quan