Bagaimana cara mendapatkan tanggal terakhir bulan tertentu dengan JodaTime?

110

Saya perlu mendapatkan tanggal pertama (sebagai org.joda.time.LocalDate) dalam sebulan dan yang terakhir. Mendapatkan yang pertama itu sepele, tetapi mendapatkan yang terakhir tampaknya membutuhkan logika karena bulan memiliki panjang yang berbeda dan panjang Februari bahkan bervariasi selama bertahun-tahun. Apakah ada mekanisme untuk hal ini yang sudah ada di JodaTime atau haruskah saya menerapkannya sendiri?

Ivan
sumber
2
Sekadar DateTime
pemberitahuan

Jawaban:

222

Bagaimana tentang:

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

dayOfMonth()mengembalikan LocalDate.Propertyyang mewakili bidang "hari dalam sebulan" dengan cara yang mengetahui asalnya LocalDate.

Saat itu terjadi, withMaximumValue()metode ini bahkan didokumentasikan untuk merekomendasikannya untuk tugas khusus ini:

Operasi ini berguna untuk mendapatkan LocalDate pada hari terakhir setiap bulan, karena panjang bulan bervariasi.

LocalDate lastDayOfMonth = dt.dayOfMonth().withMaximumValue();
Jon Skeet
sumber
1
@ Jon Skeet Bagaimana cara mendapatkannya menggunakan API Tanggal dan Waktu baru Java 8?
Warren M. Nocos
5
@ WarrenM.Nocos: Saya akan menggunakandt.with(TemporalAdjusters.lastDayOfMonth())
Jon Skeet
4

Metode sederhana lainnya adalah ini:

//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);
Abraham Maldonado Barrios
sumber
4
Lalu apa yang terjadi jika bulan Anda = 12?
jon
JodaTime API adalah bagian pekerjaan yang canggih, terisi penuh, dan nyaman. Ada banyak cara lain yang lebih tepat untuk mencapai hal ini.
aaiezza
Jika bulannya 12, Anda tahu hari terakhir adalah 31 bukan? tulis saja seperti ini: if (bulan <12) {answer = new DateTime (tahun, bulan + 1,1,0,0,0); answer = answer.minusDays (1); } lain jawaban = 31;
Abraham Maldonado Barrios
1

Pertanyaan lama, tapi hasil google teratas ketika saya mencari ini.

Jika seseorang membutuhkan hari terakhir yang sebenarnya sebagai int gantinya menggunakan JodaTime, Anda dapat melakukan ini:

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;
}
wiredniko
sumber
1
Saya lebih suka jawaban yang sedikit lebih bersih, seperti: public static int getLastDayOfMonth (int year, int month) {LocalDate date = new LocalDate (year, month, 1 return date.dayOfMonth (). GetMaximumValue ();} Tapi jawaban Anda sangat membantu, meskipun sedikit berantakan, jadi +1;)
jumps4fun
-1

Dengan menggunakan JodaTime, kita dapat melakukan ini:

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


    DateTime publik statis getLastDateOfMonth () {
        mengembalikan DateTime baru (CURRENT_YEAR, CURRENT_MONTH,
                LAST_DAY_OF_CURRENT_MONTH, LAST_HOUR_OF_CURRENT_DAY,
                LAST_MINUTE_OF_CURRENT_HOUR, LAST_SECOND_OF_CURRENT_MINUTE);
    }

Seperti yang dijelaskan di sini, di inti kecil saya di github: Kelas JodaTime dan java.util.Date Util dengan banyak fungsi yang berguna.

Dassi Orleando
sumber