Учитывая объект Date, как мне определить последний день его месяца?

StackOverflow https://stackoverflow.com/questions/72381

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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();
Это было полезно?

Решение

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


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

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


Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

Другие советы

Я бы создал объект date для первого дня СЛЕДУЮЩЕГО месяца, а затем просто вычел бы один день из объекта date.

tl;dr

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

java.время

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

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.Видишь правильный ответ Пьера Анри.

Используйте calObject.getActualMaximum(calobject.DAY_OF_MONTH)

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

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

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

В общем, гораздо проще делать подобные вещи, используя Время Джоды, например:

DateTime date = new DateTime(sampleDay.getTime());
return date.plusMonths(1).withDayOfMonth(0).minusDays(1).getMillis();

TemporalAdjuster

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

Пусть 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());

Если вы используете дата 4j библиотека:

DateTime monthEnd = dt.getEndOfMonth();

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

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

MyDate = MyDate.AddDays(DateTime.DaysInMonth(MyDate.Year, MyDate.Month) - MyDate.Day)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top