2010-05-11 46 views
28

Tôi có hai ngày:Ngày So sánh sử dụng Java

  1. toDate (sử dụng đầu vào ở định dạng MM/dd/yyyy)
  2. currentDate (thu được bằng cách new Date())

Tôi cần phải so sánh currentDate với toDate. Tôi chỉ phải hiển thị báo cáo khi số toDate bằng hoặc lớn hơn currentDate. Làm thế nào tôi có thể làm điều đó?

+0

Câu hỏi ban đầu của bạn đã thành thật nói khủng khiếp. Tôi đã cải thiện nó. Trong tương lai cố gắng càng rõ ràng càng tốt. Đừng lặp lại mọi thứ 3 lần và/hoặc không cần thiết in đậm những thứ :) – BalusC

+3

điều này có thể hữu ích nếu bạn cân nhắc sử dụng thư viện joda http://stackoverflow.com/questions/1439779/how-to-compare-two-dates-without- phần thời gian – ukanth

+0

JodaTime cung cấp nhiều hơn API ngày của Java ... http://joda-time.sourceforge.net/. Nó sẽ làm cho điều này và các nhiệm vụ ngày khác của bạn dễ dàng hơn nhiều. – harschware

Trả lời

6

Date#equals()Date#after()

Nếu có một khả năng rằng hourminute trường là! = 0, bạn phải đặt chúng vào 0.

Tôi không thể quên đề cập rằng việc sử dụng java.util.Date được coi là thực hành không tốt và hầu hết các phương pháp của nó đều không được chấp nhận. Sử dụng java.util.Calendar hoặc JodaTime, nếu có thể.

+0

Cho rằng Date.equals() sẽ so sánh mili giây và anh ấy so sánh ngày hiện tại với đầu vào người dùng MM/dd/yyyy, đó không thực sự là một cách tiếp cận hiệu quả. – BlairHippo

+0

Ông muốn so sánh không kiểm tra bình đẳng. – tkr

+0

vâng, cảm ơn, tôi đã thêm phương thức 'after' – Bozho

0

Sử dụng java.util.Calendar nếu bạn có xử lý liên quan đến ngày mở rộng.

Ngày có các phương thức before(), after(). bạn cũng có thể sử dụng chúng.

5

Bạn có thể tìm cho:

!toDate.before(currentDate) 

trước() và sau() kiểm tra xem ngày này là đúng trước hoặc sau. Vì vậy, bạn phải có sự phủ nhận của người khác để có được hành vi không nghiêm ngặt.

+0

Hãy sửa tôi nếu tôi sai, nhưng điều này sẽ không thành công nếu người dùng nhập ngày hôm nay? "new Date()" sẽ đặt thời gian bất cứ khi nào nó được gọi, và một đối tượng Date dựa trên MM/dd/yyyy sẽ có hiệu quả là 0:00 sáng hôm đó. Hoặc là Date.before() và Date.sau() không dựa trên mili giây theo cách Date.equals() là? – BlairHippo

+0

Đúng vậy. Thực ra bạn phải sử dụng Calendar hoặc DateFormatter để loại bỏ thời gian trong java.util.Date. – tkr

17

Việc so sánh ngày dễ dàng hơn bằng cách sử dụng java.util.Calendar. Đây là những gì bạn có thể làm:

Calendar toDate = Calendar.getInstance(); 
Calendar nowDate = Calendar.getInstance(); 
toDate.set(<set-year>,<set-month>,<set-day>); 
if(!toDate.before(nowDate)) { 
    //display your report 
} else { 
    // don't display the report 
} 
+0

Câu hỏi: bạn có cần xóa rõ ràng giờ/phút/v.v. các lĩnh vực ra khỏi bây giờNgày, hoặc thực tế là họ không được thiết lập trong toDate có nghĩa là họ không quan trọng? – BlairHippo

+1

+1 để sử dụng lịch. Nếu bạn không so sánh xuống gần mức mili giây, bạn thường muốn xóa() lịch ngay sau khi bạn tạo nó, sau đó gọi phương thức set. – Ophidian

+0

@Ophidian Cảm ơn lời khuyên rõ ràng() –

11

Nếu bạn đang thiết lập về việc sử dụng Java Ngày hơn, chẳng hạn, JodaTime, sử dụng một java.text.DateFormat để chuyển đổi chuỗi đến một ngày, sau đó so sánh hai sử dụng Equals:

Tôi gần như đã quên: Bạn không cần phải tính giờ, phút, giây và mili giây vào ngày hiện tại trước khi so sánh chúng. Tôi đã sử dụng một đối tượng Calendar bên dưới để thực hiện.

import java.text.DateFormat; 
import java.util.Calendar; 
import java.util.Date; 

// Other code here 
    String toDate; 
    //toDate = "05/11/2010"; 

    // Value assigned to toDate somewhere in here 

    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); 
    Calendar currDtCal = Calendar.getInstance(); 

    // Zero out the hour, minute, second, and millisecond 
    currDtCal.set(Calendar.HOUR_OF_DAY, 0); 
    currDtCal.set(Calendar.MINUTE, 0); 
    currDtCal.set(Calendar.SECOND, 0); 
    currDtCal.set(Calendar.MILLISECOND, 0); 

    Date currDt = currDtCal.getTime(); 

    Date toDt; 
    try { 
     toDt = df.parse(toDate); 
    } catch (ParseException e) { 
     toDt = null; 
     // Print some error message back to the user 
    } 

    if (currDt.equals(toDt)) { 
     // They're the same date 
    } 
+0

Đã khắc phục một số lỗi trong trường hợp này ... quên bắt 'ParseException' trong phiên bản gốc. – Powerlord

4

Đây là một trong những cách sau:

String toDate = "05/11/2010"; 

if (new SimpleDateFormat("MM/dd/yyyy").parse(toDate).getTime()/(1000 * 60 * 60 * 24) >= System.currentTimeMillis()/(1000 * 60 * 60 * 24)) { 
    System.out.println("Display report."); 
} else { 
    System.out.println("Don't display report."); 
} 

Một chút dễ dàng hơn interpretable:

String toDateAsString = "05/11/2010"; 
Date toDate = new SimpleDateFormat("MM/dd/yyyy").parse(toDateAsString); 
long toDateAsTimestamp = toDate.getTime(); 
long currentTimestamp = System.currentTimeMillis(); 
long getRidOfTime = 1000 * 60 * 60 * 24; 
long toDateAsTimestampWithoutTime = toDateAsTimestamp/getRidOfTime; 
long currentTimestampWithoutTime = currentTimestamp/getRidOfTime; 

if (toDateAsTimestampWithoutTime >= currentTimestampWithoutTime) { 
    System.out.println("Display report."); 
} else { 
    System.out.println("Don't display report."); 
} 

Oh, như một phần thưởng, biến những 's JodaTime:

String toDateAsString = "05/11/2010"; 
DateTime toDate = DateTimeFormat.forPattern("MM/dd/yyyy").parseDateTime(toDateAsString); 
DateTime now = new DateTime(); 

if (!toDate.toLocalDate().isBefore(now.toLocalDate())) { 
    System.out.println("Display report."); 
} else { 
    System.out.println("Don't display report."); 
} 
+0

Ví dụ đầu tiên hoạt động hoàn hảo cho nhu cầu của tôi :) – atwright147

1

Nếu vì lý do nào đó bạn ý định về việc sử dụng Date đối tượng cho giải pháp của bạn, bạn sẽ cần phải làm một cái gì đó như thế này:


    // Convert user input into year, month, and day integers 
    Date toDate = new Date(year - 1900, month - 1, day + 1); 
    Date currentDate = new Date(); 
    boolean runThatReport = toDate.after(currentDate); 

Chuyển các toDate trước đến nửa đêm của ngày hôm sau sẽ chăm sóc các lỗi tôi đã rên rỉ về trong các ý kiến cho các câu trả lời khác. Nhưng, lưu ý rằng phương pháp này sử dụng một hàm tạo không được chấp nhận; bất kỳ phương pháp nào dựa trên Date sẽ sử dụng một phương pháp không được chấp nhận hoặc phương pháp khác và tùy thuộc vào cách bạn thực hiện điều đó cũng có thể dẫn đến các điều kiện chủng tộc (nếu bạn đặt cơ sở toDate tắt số new Date() và sau đó fiddle với năm, tháng và ngày)). Sử dụng Calendar, như được mô tả ở nơi khác.

3

Ngày long getTime() trả về số mili giây kể từ January 1, 1970, 00:00:00 GMT được đại diện bởi đối tượng Ngày tháng này.

//test if date1 is before date2 
if(date1.getTime() < date2.getTime()) { 
.... 
} 
2

tin boolean checkDateLimit() {

long CurrentDateInMilisecond = System.currentTimeMillis(); // Date 1 
    long Date1InMilisecond = Date1.getTimeInMillis(); //Date2 

    if (CurrentDateInMilisecond <= Date1InMilisecond) { 
     return true; 
    } else { 
     return false; 
    } 

} 

// Chuyển đổi cả ngày vào giá trị milisecond.