2012-03-14 69 views
96

Tôi cần lấy ngày đầu tiên (là org.joda.time.LocalDate) của tháng và ngày cuối cùng. Bắt đầu tiên là tầm thường, nhưng nhận được cuối cùng có vẻ cần một số logic như tháng có chiều dài khác nhau và chiều dài tháng hai thậm chí thay đổi qua nhiều năm. Có một cơ chế cho điều này đã được xây dựng trong JodaTime hay tôi nên thực hiện nó bản thân mình?Làm thế nào để có được ngày cuối cùng của một tháng cụ thể với JodaTime?

+1

Chỉ cần thông báo, điều này cũng hoạt động với các loại 'DateTime' :) – vikingsteve

Trả lời

186

Làm thế nào về:

LocalDate endOfMonth = date.dayOfMonth().withMaximumValue(); 

dayOfMonth() trả về một LocalDate.Property đại diện cho "ngày của tháng" lĩnh vực theo một cách mà biết nguồn gốc LocalDate.

Vì nó xảy ra, phương pháp withMaximumValue() thậm chí còn documented để giới thiệu nó cho nhiệm vụ đặc biệt này:

hoạt động này rất hữu ích cho việc thu thập một LOCALDATE vào ngày cuối cùng của tháng, như độ dài tháng khác nhau.

LocalDate lastDayOfMonth = dt.dayOfMonth().withMaximumValue(); 
+0

@Jon Skeet Làm cách nào để sử dụng API ngày và giờ mới của Java 8? –

+4

@ WarrenM.Nocos: Tôi muốn sử dụng 'dt.with (TemporalAdjusters.lastDayOfMonth())' –

0

Một câu hỏi cũ, nhưng một kết quả google hàng đầu khi tôi đang tìm kiếm này.

Nếu ai đó cần ngày cuối cùng thực tế như một int thay vì sử dụng JodaTime bạn có thể làm điều này:

public static final int JANUARY = 1; 

public static final int DECEMBER = 12; 

public static final int FIRST_OF_THE_MONTH = 1; 

public final int getLastDayOfMonth(final int month, final int year) { 
    int lastDay = 0; 

    if ((month >= JANUARY) && (month <= DECEMBER)) { 
     LocalDate aDate = new LocalDate(year, month, FIRST_OF_THE_MONTH); 

     lastDay = aDate.dayOfMonth().getMaximumValue(); 
    } 

    return lastDay; 
} 
-1

Sử dụng JodaTime, chúng ta có thể làm điều này:

 

    public static final Integer CURRENT_YEAR = DateTime.now().getYear(); 

    public static final Integer CURRENT_MONTH = DateTime.now().getMonthOfYear(); 

    public static final Integer LAST_DAY_OF_CURRENT_MONTH = DateTime.now() 
      .dayOfMonth().getMaximumValue(); 

    public static final Integer LAST_HOUR_OF_CURRENT_DAY = DateTime.now() 
      .hourOfDay().getMaximumValue(); 

    public static final Integer LAST_MINUTE_OF_CURRENT_HOUR = DateTime.now().minuteOfHour().getMaximumValue(); 

    public static final Integer LAST_SECOND_OF_CURRENT_MINUTE = DateTime.now().secondOfMinute().getMaximumValue(); 


    public static DateTime getLastDateOfMonth() { 
     return new DateTime(CURRENT_YEAR, CURRENT_MONTH, 
       LAST_DAY_OF_CURRENT_MONTH, LAST_HOUR_OF_CURRENT_DAY, 
       LAST_MINUTE_OF_CURRENT_HOUR, LAST_SECOND_OF_CURRENT_MINUTE); 
    }

Như mô tả ở đây trong nhỏ của tôi gist on github: A JodaTime and java.util.Date Util Class with a lot of usefull functions.

5

Một phương pháp đơn giản khác là:

//Set the Date in First of the next Month: 
answer = new DateTime(year,month+1,1,0,0,0); 
//Now take away one day and now you have the last day in the month correctly 
answer = answer.minusDays(1); 
+0

điều gì xảy ra sau đó nếu tháng của bạn là = 12? – jon

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