Для данного объекта Date как определить последний день его месяца? - PullRequest
6 голосов
/ 16 сентября 2008

Я пытаюсь использовать следующий код, но он возвращает неправильный день месяца.

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.MONTH, sampleDay.get(Calendar.MONTH)+1);
cal.set(Calendar.DAY_OF_MONTH, 0);
return cal.getTime();

Ответы [ 8 ]

17 голосов
/ 16 сентября 2008

Получите количество дней в этом месяце:

<code>
Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
int noOfLastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

Установить календарь на последний день этого месяца:

<code>
Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
3 голосов
/ 25 июня 2016

ТЛ; др

YearMonth.from(
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
).atEndOfMonth()

java.time

Вопрос и другие ответы используют старые устаревшие классы. Они были вытеснены классами java.time , встроенными в Java 8 и более поздние версии. См. Oracle Tutorial . Большая часть функций была перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .

LocalDate

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса. Хотя эти объекты не хранят часовой пояс, имейте в виду, что часовой пояс имеет решающее значение при определении текущей даты. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );  // 2016-06-25

YearMonth

Объедините с классом YearMonth, чтобы определить последний день любого месяца.

YearMonth currentYearMonth = YearMonth.from( today );  // 2016-06
LocalDate lastDayOfCurrentYearMonth = currentYearMonth.atEndOfMonth();  // 2016-06-30

Кстати, и LocalDate, и YearMonth используют номера месяцев, как и следовало ожидать (1-12), а не шарик 0-11, который видели в старых классах даты и времени. Одно из многих неудачных дизайнерских решений, которые делают эти старые классы даты и времени такими хлопотными и запутанными.

TemporalAdjuster

Другой правильный подход - использование TemporalAdjuster. См. правильный ответ Пьера Генри .

3 голосов
/ 16 сентября 2008

Я бы создал объект даты для первого дня следующего месяца, а затем просто вычел бы один день из объекта даты.

2 голосов
/ 24 октября 2017

TemporalAdjuster

Используя (относительно) новый API дат Java , на самом деле это очень просто:

Пусть date будет экземпляром LocalDate, например:

LocalDate date = LocalDate.of(2018, 1, 22);

или

LocalDate date = LocalDate.now();

или, конечно, вы можете получить его как пользовательский ввод, из базы данных и т. Д.

Затем примените реализацию интерфейса TemporalAdjuster в классе TemporalAdjusters:

LocalDate first = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDate last = date.with(TemporalAdjusters.lastDayOfMonth());
2 голосов
/ 16 сентября 2008

Использовать calObject.getActualMaximum (calobject.DAY_OF_MONTH)

См. Real's Java How-to для получения дополнительной информации об этом.

2 голосов
/ 16 сентября 2008

Похоже, вы установили календарь на первый день следующего месяца, поэтому вам нужно еще одну строку, чтобы вычесть один день, чтобы получить последний день месяца, в котором sampleDay находится в:

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.roll(Calendar.MONTH, true);
cal.set(Calendar.DAY_OF_MONTH, 0);
cal.add(Calendar.DAY_OF_MONTH, -1);

В общем, гораздо проще делать такие вещи, используя Joda Time , например:

DateTime date = new DateTime(sampleDay.getTime());
return date.plusMonths(1).withDayOfMonth(0).minusDays(1).getMillis();
1 голос
/ 13 февраля 2011

Если вы используете библиотеку date4j :

DateTime monthEnd = dt.getEndOfMonth();
0 голосов
/ 16 ноября 2012

Я думаю, что это должно хорошо работать:

Dim MyDate As Date = #11/14/2012#  'This is just an example date

MyDate = MyDate.AddDays(DateTime.DaysInMonth(MyDate.Year, MyDate.Month) - MyDate.Day)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...