จะรับวันสุดท้ายของเดือนใดเดือนหนึ่งกับ JodaTime ได้อย่างไร?


110

ฉันต้องการวันที่แรก (เป็นorg.joda.time.LocalDate) ของเดือนและวันสุดท้าย การได้รับครั้งแรกเป็นเรื่องเล็กน้อย แต่การได้รับครั้งสุดท้ายดูเหมือนจะต้องใช้เหตุผลบางประการเนื่องจากเดือนมีความยาวต่างกันและความยาวของเดือนกุมภาพันธ์จะแตกต่างกันไปในแต่ละปี มีกลไกสำหรับสิ่งนี้ใน JodaTime อยู่แล้วหรือฉันควรใช้มันด้วยตัวเอง?


2
เพียงแค่DateTime
ระวัง

คำตอบ:


222

เกี่ยวกับ:

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

dayOfMonth()ส่งกลับLocalDate.Propertyซึ่งหมายถึง "วันของเดือน" LocalDateข้อมูลในทางที่จะรู้ที่มาที่

เมื่อมันเกิดขึ้นwithMaximumValue()วิธีนี้ยังได้รับการจัดทำเป็นเอกสารเพื่อแนะนำสำหรับงานนี้โดยเฉพาะ:

การดำเนินการนี้มีประโยชน์สำหรับการรับ LocalDate ในวันสุดท้ายของเดือนเนื่องจากความยาวของเดือนแตกต่างกันไป

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

1
@Jon Skeet วิธีรับสิ่งนี้โดยใช้ Date and Time API ใหม่ของ Java 8
Warren M. Nocos

5
@ WarrenM.Nocos: ฉันจะใช้dt.with(TemporalAdjusters.lastDayOfMonth())
Jon Skeet

4

อีกวิธีง่ายๆคือ:

//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
จะเกิดอะไรขึ้นถ้าเดือนของคุณ = 12?
จอน

JodaTime API เป็นชิ้นงานที่ซับซ้อนโหลดเต็มและสะดวกสบาย มีวิธีอื่น ๆ อีกมากมายในการทำสิ่งนี้ให้สำเร็จ
aaiezza

ถ้าเดือน 12 คุณรู้ว่าวันสุดท้ายคือ 31 ใช่ไหม? เพียงแค่ใส่สิ่งนี้: if (month <12) {answer = new DateTime (year, month + 1,1,0,0,0); answer = answer.minusDays (1); } else answer = 31;
Abraham Maldonado Barrios

1

คำถามเก่า แต่เป็นผลการค้นหายอดนิยมของ Google เมื่อฉันกำลังมองหาสิ่งนี้

หากมีคนต้องการวันสุดท้ายจริงintแทนการใช้ JodaTime คุณสามารถทำได้:

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
ฉันอยากได้คำตอบที่สะอาดกว่าเล็กน้อยเช่น public static int getLastDayOfMonth (int year, int month) {LocalDate date = new LocalDate (year, month, 1 return date.dayOfMonth (). getMaximumValue ();} แต่คำตอบของคุณ มีประโยชน์มากแม้ว่าจะรกเล็กน้อยก็ +1;)
jumps4fun

-1

เมื่อใช้ JodaTime เราสามารถทำได้:

    จำนวนเต็มสุดท้ายคงที่สาธารณะ CURRENT_YEAR = DateTime.now (). getYear ();

    จำนวนเต็มสุดท้ายแบบคงที่สาธารณะ CURRENT_MONTH = DateTime.now () getMonthOfYear ();

    จำนวนเต็มสุดท้ายแบบคงที่สาธารณะ LAST_DAY_OF_CURRENT_MONTH = DateTime.now ()
            .dayOfMonth (). getMaximumValue ();

    จำนวนเต็มสุดท้ายแบบคงที่สาธารณะ LAST_HOUR_OF_CURRENT_DAY = DateTime.now ()
            .hourOfDay (). getMaximumValue ();

    จำนวนเต็มสุดท้ายแบบคงที่สาธารณะ LAST_MINUTE_OF_CURRENT_HOUR = DateTime.now (). minuteOfHour (). getMaximumValue ();

    จำนวนเต็มสุดท้ายแบบคงที่สาธารณะ LAST_SECOND_OF_CURRENT_MINUTE = DateTime.now (). secondOfMinute (). getMaximumValue ();


    DateTime แบบคงที่สาธารณะ getLastDateOfMonth () {
        ส่งคืน 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);
    }

ตามที่อธิบายไว้ที่นี่ในส่วนสำคัญเล็ก ๆ ของฉันใน github: A JodaTime และ java.util.Date Util Class ที่มีฟังก์ชั่นที่มีประโยชน์มากมาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.