2009-05-19 71 views

Trả lời

90

Nếu bạn không biết thứ tự của các min/max giá trị

Date a, b; // assume these are set to something 
Date d;  // the date in question 

return a.compareTo(d) * d.compareTo(b) > 0; 

Nếu bạn muốn phạm vi được bao gồm

return a.compareTo(d) * d.compareTo(b) >= 0; 
+18

Hoạt động, nhưng không thể đọc được. Dù sao cũng cảm ơn bạn. –

+1

@BrunoDeFreitasBarros Bạn có ý nghĩa gì bởi "không đọc được"? –

+1

@Peter Lawrey Bruno có nghĩa là thật khó để hiểu được code w/o bình luận. – Mirimas

36

Giống như vậy:

Date min, max; // assume these are set to something 
Date d;   // the date in question 

return d.compareTo(min) >= 0 && d.compareTo(max) <= 0; 

Bạn có thể sử dụng > thay vì >=< thay vì <= để loại trừ các thiết bị đầu cuối từ cảm giác "giữa."

+0

Cảm ơn bạn đã phản hồi ngay lập tức. –

+1

Điều này không phải lúc nào cũng hiệu quả. Tôi đã gặp vấn đề khi sử dụng các đối tượng compareTo on Date. Ngày 1 tháng 1 năm 2006 rõ ràng là sau ngày 1 tháng 4 năm 2006 trong một trong các chương trình của tôi. – KitsuneYMG

+0

@KitsuneYMG: Tôi đã thử đoạn mã sau và hoạt động như mong đợi: 'Date date1 = new Date (2006, 1, 1); // Jan 1,2006 Date date2 = new Date (2006, 4, 1); // Ngày 1 tháng 4 năm 2006 System.out.println (date1.compareTo (date2)); // -1 System.out.println (date2.compareTo (ngày1)); // 1'. Bạn có thể chia sẻ ở đây những gì là * không làm việc * cho bạn? – Gnanam

212

Điều này có thể dễ đọc hơn một chút:

Date min, max; // assume these are set to something 
Date d;   // the date in question 

return d.after(min) && d.before(max); 
+1

Rất khỏe mạnh 9 giây nhanh hơn, thưa bạn. –

+42

giữa có thể bao gồm các điểm cuối, trong trường hợp đó bạn có thể sử dụng trả về! D.before (min) &&! D.after (max); –

+1

@Tetsujin no Oni xin lỗi người đàn ông, điều tốt đẹp của nó là tôi không có khả năng giao hàng lớn trong một vài tuần mà cả hai đều giúp và bị tổn thương bởi SO. :) –

2

bạn có thể sử dụng getTime() và so sánh các giá trị tính theo giờ UTC dài trở lại.

CHỈNH SỬA nếu bạn chắc chắn bạn sẽ không phải đối phó với những ngày trước năm 1970, không chắc chắn nó sẽ hoạt động như thế nào trong trường hợp đó.

8

Một lựa chọn khác

min.getTime() <= d.getTime() && d.getTime() <= max.getTime() 
2

Bạn có thể muốn có một cái nhìn tại Joda Time mà là một API thực sự tốt để đối phó với ngày/giờ. Mặc dù nếu bạn không thực sự cần nó cho các giải pháp cho câu hỏi hiện tại của bạn nó là ràng buộc để giúp bạn tiết kiệm đau trong tương lai.

+1

Có suy nghĩ ngay lập tức của tôi là đề xuất thời gian Joda nhưng tôi không thể thấy bất cứ điều gì trong API để hỗ trợ kiểm tra "trong phạm vi". Ai khác? – dukedave

+1

Tôi không đề xuất Joda cho vấn đề cụ thể này, vì nó đã có nhiều giải pháp. – willcodejavaforfood

+1

Nhưng bạn sẽ tạo một Khoảng thời gian trong Thời gian Joda để thực hiện tác vụ này – willcodejavaforfood

2
import java.util.Date; 

public class IsDateBetween { 

public static void main (String[] args) { 

      IsDateBetween idb=new IsDateBetween("12/05/2010"); // passing your Date 
} 
public IsDateBetween(String dd) { 

     long from=Date.parse("01/01/2000"); // From some date 

     long to=Date.parse("12/12/2010");  // To Some Date 

     long check=Date.parse(dd); 

     int x=0; 

     if((check-from)>0 && (to-check)>0) 
     { 
      x=1; 
     } 

System.out.println ("From Date is greater Than ToDate : "+x); 
} 

} 
+1

Đây là mã đẹp, đây có lẽ là một trong những chức năng tốt nhất mà tôi từng thấy. Nó đã giúp tôi rất nhiều. Cảm ơn bạn! – Bassiuz

1

Ở đây bạn đi:

public static void main(String[] args) throws ParseException { 

     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 

     String oeStartDateStr = "04/01/"; 
     String oeEndDateStr = "11/14/"; 

     Calendar cal = Calendar.getInstance(); 
     Integer year = cal.get(Calendar.YEAR); 

     oeStartDateStr = oeStartDateStr.concat(year.toString()); 
     oeEndDateStr = oeEndDateStr.concat(year.toString()); 

     Date startDate = sdf.parse(oeStartDateStr); 
     Date endDate = sdf.parse(oeEndDateStr); 
     Date d = new Date(); 
     String currDt = sdf.format(d); 


     if((d.after(startDate) && (d.before(endDate))) || (currDt.equals(sdf.format(startDate)) ||currDt.equals(sdf.format(endDate)))){ 
      System.out.println("Date is between 1st april to 14th nov..."); 
     } 
     else{ 
      System.out.println("Date is not between 1st april to 14th nov..."); 
     } 
    } 
10

Dưới đây là một số cách để thực hiện việc này bằng cách sử dụng Joda-Time 2.3 thư viện.

Một cách là sử dụng các phương thức isBeforeisAfter đơn giản trên DateTime trường hợp. Nhân tiện, DateTime trong Joda-Time tương tự như khái niệm với java.util.Date (một thời điểm trong thời gian của Vũ trụ) nhưng bao gồm một múi giờ.

Một cách khác là tạo khoảng thời gian trong thời gian Joda. Các thử nghiệm phương pháp contains nếu một Ngày giờ đã cho xảy ra trong khoảng thời gian được bao hàm bởi Khoảng thời gian. Sự bắt đầu của Khoảng thời gian được bao gồm, nhưng điểm cuối là độc quyền. Cách tiếp cận này được gọi là "Nửa mở", biểu tượng [).

Xem cả hai cách trong ví dụ mã sau.

Chuyển đổi các phiên bản java.util.Date thành các phiên bản Joda-Time DateTime. Đơn giản chỉ cần chuyển thể hiện Date tới hàm tạo của DateTime. Trong thực tế, bạn cũng nên chuyển đối tượng DateTimeZone cụ thể thay vì dựa vào múi giờ mặc định của JVM.

DateTime dateTime1 = new DateTime(new java.util.Date()).minusWeeks(1); 
DateTime dateTime2 = new DateTime(new java.util.Date()); 
DateTime dateTime3 = new DateTime(new java.util.Date()).plusWeeks(1); 

Hãy so sánh bằng cách kiểm tra cho trước/sau ...

boolean is1After2 = dateTime1.isAfter(dateTime2); 
boolean is2Before3 = dateTime2.isBefore(dateTime3); 

boolean is2Between1And3 = ((dateTime2.isAfter(dateTime1)) && (dateTime2.isBefore(dateTime3))); 

Sử dụng cách tiếp cận Interval thay vì isAfter/isBefore ...

Interval interval = new Interval(dateTime1, dateTime3); 
boolean intervalContainsDateTime2 = interval.contains(dateTime2); 

Dump để an ủi ...

System.out.println("DateTimes: " + dateTime1 + " " + dateTime1 + " " + dateTime1); 
System.out.println("is1After2 " + is1After2); 
System.out.println("is2Before3 " + is2Before3); 
System.out.println("is2Between1And3 " + is2Between1And3); 
System.out.println("intervalContainsDateTime2 " + intervalContainsDateTime2); 

Khi chạy ...

DateTimes: 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 
is1After2 false 
is2Before3 true 
is2Between1And3 true 
intervalContainsDateTime2 true 
2

Sau đây là cách để tìm xem hôm nay là giữa 2 tháng:

private boolean isTodayBetween(int from, int to) { 
    if (from < 0 || to < 0 || from > Calendar.DECEMBER || to > Calendar.DECEMBER) { 
     throw new IllegalArgumentException("Invalid month provided: from = " + from + " to = " + to); 
    } 
    Date now = new Date(); 
    GregorianCalendar cal = new GregorianCalendar(); 
    cal.setTime(now); 
    int thisMonth = cal.get(Calendar.MONTH); 
    if (from > to) { 
     to = to + Calendar.DECEMBER; 
     thisMonth = thisMonth + Calendar.DECEMBER; 
    } 
    if (thisMonth >= from && thisMonth <= to) { 
     return true; 
    } 
    return false; 
} 

và gọi nó là thích:

isTodayBetween(Calendar.OCTOBER, Calendar.MARCH) 
1

giữa ngày Bao gồm điểm cuối có thể được viết như

public static boolean isDateInBetweenIncludingEndPoints(final Date min, final Date max, final Date date){ 
    return !(date.before(min) || date.after(max)); 
} 
Các vấn đề liên quan