2010-01-15 40 views
7

Tôi có ngày bắt đầu và ngày kết thúc. Tôi cần phải lặp qua mỗi ngày giữa 2 ngày này.Tôi cần chu kỳ lặp lại qua khoảng thời gian

Cách tốt nhất để làm điều này là gì?

Tôi có thể đề nghị chỉ một cái gì đó như:

Date currentDate = new Date (startDate.getTime()); 
while (true) { 
    if (currentDate.getTime() >= endDate.getTime()) 
     break; 
    doSmth(); 
    currentDate = new Date (currentDate.getTime() + MILLIS_PER_DAY); 
} 

Trả lời

13

sẵn sàng để chạy ;-)

public static void main(String[] args) throws ParseException { 
    GregorianCalendar gcal = new GregorianCalendar(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); 
    Date start = sdf.parse("2010.01.01"); 
    Date end = sdf.parse("2010.01.14"); 
    gcal.setTime(start); 
    while (gcal.getTime().before(end)) { 
     gcal.add(Calendar.DAY_OF_YEAR, 1); 
     System.out.println(gcal.getTime().toString()); 
    } 
} 
+0

Câu trả lời của bạn đã cứu mạng tôi !!! – NinjaBoy

3

Sử dụng một đối tượng Lịch nếu bạn muốn thao tác ngày.

Calendar c = Calendar.getInstance(); 
    // ... set the calendar time ... 
    Date endDate = new Date(); 
    // ... set the endDate value ... 

    while (c.getTime().before(endDate) { 
     // do something 
     c.add(Calendar.DAY_OF_WEEK, 1); 
    } 

Hoặc sử dụng Joda Time

6

Ditto trên những người nói sử dụng một đối tượng Lịch.

Bạn có thể gặp rắc rối đáng ngạc nhiên nếu bạn cố gắng sử dụng đối tượng Ngày và thêm 24 giờ vào nó.

Đây là câu đố cho bạn: Tháng dài nhất trong năm là gì? Bạn có thể nghĩ rằng không có câu trả lời cho câu hỏi đó. Bảy tháng có 31 ngày, vì vậy chúng có cùng độ dài, phải không? Vâng, ở Hoa Kỳ sẽ gần như đúng, nhưng ở châu Âu nó sẽ là sai! Ở châu Âu, tháng 10 là tháng dài nhất. Nó có 31 ngày và 1 giờ, bởi vì người châu Âu đặt đồng hồ của họ trở lại 1 giờ cho Daylight Saving Time trong tháng Mười, làm cho một ngày trong tháng Mười vừa qua 25 giờ. (Người Mỹ bây giờ bắt đầu DST trong tháng mười một, trong đó có 30 ngày, vì vậy tháng mười vẫn còn ngắn hơn tháng mười hoặc tháng mười hai. Do đó làm cho câu đố đó không phải là thú vị cho người Mỹ.)

Tôi đã từng gặp rắc rối bằng cách làm chính xác những gì bạn đang cố gắng làm: Tôi đã sử dụng một đối tượng Date và thêm 24 giờ vào nó trong một vòng lặp. Nó hoạt động miễn là tôi không vượt qua ranh giới Thời gian tiết kiệm ánh sáng ban ngày. Nhưng khi tôi đã làm, đột nhiên tôi bỏ qua một ngày hoặc nhấn cùng một ngày hai lần, bởi vì nửa đêm ngày 8 tháng 3 năm 2009 + 24 giờ = 1:00 sáng ngày 10 tháng 3. Giảm thời gian, như tôi đang làm, và ngày 9 tháng 3 đã bị bỏ qua bí ẩn . Tương tự như vậy, nửa đêm ngày 1 tháng 11 năm 2009 + 24 giờ = 11:00 PM ngày 1 tháng 11 và chúng tôi đã đạt đến ngày 1 tháng 11 hai lần.

+0

cảm ơn sự bổ sung của bạn – Roman

+0

Thú vị, nhưng mọi người bỏ phiếu nhiều hơn cho mã 'sẵn sàng chạy' :) –

+0

Stacker đã đưa ra mã. Tôi chỉ đang cố giải thích TẠI SAO đó là câu trả lời đúng và ý tưởng OP sẽ không hoạt động. Chắc chắn, một ví dụ về mã làm việc là một điều tốt, nhưng trừ khi bạn hiểu tại sao nó hoạt động, nó chỉ giúp bạn vượt qua vấn đề trước mắt. Lần tới, một vấn đề tương tự nhưng không hoàn toàn giống nhau xuất hiện, bạn sẽ bị kẹt lại. :-) – Jay

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