Làm cách nào để có được ngày cuối cùng của một tháng cụ thể với JodaTime?


110

Tôi cần có buổi hẹn hò đầu tiên (như org.joda.time.LocalDate ) của một tháng và ngày cuối cùng. Bắt cái đầu tiên là chuyện nhỏ nhặt, nhưng việc lấy cái cuối cùng dường như cần một số logic vì các tháng có độ dài khác nhau và độ dài của tháng 2 thậm chí thay đổi theo năm. Có cơ chế nào cho việc này đã được tích hợp sẵn trong JodaTime không hay tôi nên tự triển khai nó?


2
Chỉ cần một heads-up, điều này cũng làm việc với DateTimecác loại :)
vikingsteve

Câu trả lời:


222

Làm thế nào về:

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

dayOfMonth()trả về một LocalDate.Propertyđại diện cho trường "ngày trong tháng" theo cách biết nguồn gốc LocalDate.

Khi nó xảy ra, withMaximumValue()phương pháp thậm chí còn được ghi lại để đề xuất nó cho nhiệm vụ cụ thể này:

Thao tác này hữu ích để lấy LocalDate vào ngày cuối cùng của tháng, vì độ dài tháng khác nhau.

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

1
@Jon Skeet Làm thế nào để có được điều này bằng cách sử dụng API Ngày và Giờ mới của Java 8?
Warren M. Nocos

5
@ WarrenM.Nocos: Tôi muốn sử dụngdt.with(TemporalAdjusters.lastDayOfMonth())
Jon Skeet,

4

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);

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

API JodaTime là một công việc phức tạp, được tải đầy đủ và thuận tiện. Có nhiều cách khác, đúng đắn hơn để đạt được điều này.
aaiezza

Nếu tháng là 12, bạn biết ngày cuối cùng là 31 đúng không? chỉ cần đặt một cái gì đó như sau: if (tháng <12) {answer = new DateTime (năm, tháng + 1,1,0,0,0); answer = answer.minusDays (1); } câu trả lời khác = 31;
Abraham Maldonado Barrios,

1

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

Nếu ai đó cần ngày cuối cùng thực sự intthay thế bằ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
Tôi sẽ thích một câu trả lời rõ ràng hơn một chút, như: public static int getLastDayOfMonth (int year, int month) {LocalDate date = new LocalDate (year, month, 1 return date.dayOfMonth (). GetMaximumValue ();} Nhưng câu trả lời của bạn là siêu hữu ích, thậm chí nếu hơi lộn xộn, vì vậy 1;)
jumps4fun

-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 (). minutesOfHour (). getMaximumValue ();

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


    public static DateTime getLastDateOfMonth () {
        trả lại DateTime mới (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 ý chính nhỏ của tôi trên github: Lớp JodaTime và java.util.Date Util với rất nhiều chức năng hữu ích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.