Получите первый и последний день месяца, используя threeten, LocalDate

У меня есть LocalDate, которому нужно получить первый и последний день месяца. Как я могу это сделать?

например. 13/2/2014 Мне нужно получить 1/2/2014 и 28/2/2014 в LocalDate форматы.

Использование трех десятков классов LocalDate.


person user1746050    schedule 06.03.2014    source источник
comment
Используйте: LocalDate start = YearMonth.now (). AtDay (1); LocalDate end = YearMonth.now (). AtEndOfMonth (); ИЛИ: LocalDate startDay = Year.of (2020) .atMonth (11) .atDay (1); LocalDate endDay = Year.of (2020) .atMonth (11) .atEndOfMonth ();   -  person Wedson Quintanilha da Silva    schedule 17.11.2020


Ответы (10)


Просто используйте withDayOfMonth и lengthOfMonth():

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.lengthOfMonth());
person Jon Skeet    schedule 06.03.2014
comment
К вашему сведению, я вижу другие ответы - person assylias; 08.04.2014

API был разработан для поддержки решения, которое близко соответствует бизнес-требованиям.

import static java.time.temporal.TemporalAdjusters.*;

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());

Однако решения Джона тоже хороши.

person JodaStephen    schedule 07.03.2014
comment
В этом случае используются ресурсы API, специально созданные для решения этой конкретной проблемы. - person jpangamarca; 11.07.2017

YearMonth

Для полноты и элегантности, на мой взгляд, см. Использование _ 2_ класс.

YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end   = month.atEndOfMonth();

Для первого и последнего дня текущего месяца это будет:

LocalDate start = YearMonth.now().atDay(1);
LocalDate end   = YearMonth.now().atEndOfMonth();
person herman    schedule 18.04.2018
comment
Лучшее решение из всех. - person Agustí Sánchez; 20.06.2018
comment
Дополнительная информация: YearMonth yearMonth = YearMonth.parse (202004, DateTimeFormatter.ofPattern (yyyyMM)); - person egemen; 07.01.2020
comment
в чем его преимущества по сравнению с LocalDate with методом? - person AndrewBloom; 12.03.2020
comment
@AndrewBloom вам не нужно использовать статическую функцию, чтобы получить последний день месяца, и, по крайней мере, во втором примере вам не нужно иметь экземпляр LocalDate для начала. - person herman; 15.03.2020

Ответ Джона Скитса правильный и заслужил мое одобрение, просто добавив это немного другое решение для полноты:

import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
person Meno Hochschild    schedule 06.03.2014
comment
Уважаемый, отрицательный голос, честно говоря, я не понимаю отрицательного голоса, потому что мой ответ был даже на день раньше, чем ответ JodaStephen, и указал на в основном интересную новую часть, а именно на временный регулятор на конец месяца. То есть я ни у кого не копировал ответ. - person Meno Hochschild; 21.05.2018
comment
Отличный ответ! Это решение лучше, потому что оно рекомендовано в документах: ... найти первый или последний день месяца - person peterchaula; 24.05.2020

Если кто-то ищет первый день предыдущего месяца и последний день предыдущего месяца:

public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
        return date.minusMonths(1).withDayOfMonth(1);
    }


public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
        return date.withDayOfMonth(1).minusDays(1);
    }
person Anil Bhaskar    schedule 27.12.2018
comment
Хороший код, но в ответе на переполнение стека следует учитывать специфику вопроса. - person Basil Bourque; 28.12.2018
comment
Спасибо, согласен. Иногда мы находим связанный код в потоке, потому что я тоже искал его. Я как раз для таких пользователей ставил. Надеюсь, что все в порядке. Спасибо. - person Anil Bhaskar; 08.01.2019

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

    LocalDate start = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()-1);
    LocalDate end = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()).plusMonths(1);
    System.out.println("Start of month: " + start);
    System.out.println("End of month: " + end);

Результат:

>     Start of month: 2019-12-01
>     End of month: 2019-12-30
person VSs    schedule 04.12.2019
comment
Мне это кажется немного сложным. Это также не дает правильного результата. Последний день этого месяца - 31 декабря 2019 года, но ваш фрагмент напечатан 30 декабря 2019 года. - person Ole V.V.; 04.12.2019

если вы хотите сделать это только с помощью класса LocalDate:

LocalDate initial = LocalDate.of(2014, 2, 13);

LocalDate start = LocalDate.of(initial.getYear(), initial.getMonthValue(),1);

// Idea: the last day is the same as the first day of next month minus one day.
LocalDate end = LocalDate.of(initial.getYear(), initial.getMonthValue(), 1).plusMonths(1).minusDays(1);
person MrSmith42    schedule 21.02.2019

Попробуй это:

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);         
LocalDate end = initial.withDayOfMonth(initial.getMonthOfYear().getLastDayOfMonth(false));
System.out.println(start);
System.out.println(end);

вы можете найти желаемый результат, но вам нужно позаботиться о параметре true / false для метода getLastDayOfMonth

этот параметр обозначает високосный год

person Shekhar Rajput    schedule 06.03.2014
comment
Нет необходимости использовать getLastDayOfMonth - см. Мой ответ о более простом подходе. - person Jon Skeet; 06.03.2014

Просто здесь, чтобы показать мою реализацию решения @herman

ZoneId americaLaPazZone = ZoneId.of("UTC-04:00");

static Date firstDateOfMonth(Date date) {
  LocalDate localDate = convertToLocalDateWithTimezone(date);
  YearMonth baseMonth = YearMonth.from(localDate);
  LocalDateTime initialDate = baseMonth.atDay(firstDayOfMonth).atStartOfDay();
  return Date.from(initialDate.atZone(americaLaPazZone).toInstant());
}

static Date lastDateOfMonth(Date date) {
  LocalDate localDate = convertToLocalDateWithTimezone(date);
  YearMonth baseMonth = YearMonth.from(localDate);
  LocalDateTime lastDate = baseMonth.atEndOfMonth().atTime(23, 59, 59);
  return Date.from(lastDate.atZone(americaLaPazZone).toInstant());
}

static LocalDate convertToLocalDateWithTimezone(Date date) {
  return LocalDateTime.from(date.toInstant().atZone(americaLaPazZone)).toLocalDate();
}
person Luis Roberto    schedule 21.09.2019
comment
LocalDateTime - это совершенно неподходящий класс для использования здесь. Вы теряете ценную информацию о зоне / смещении. - person Basil Bourque; 21.09.2019
comment
Вопрос запрашивает значение только даты, а не значения даты со временем, которые вы здесь ищете. И ужасный устаревший класс Date не имеет ничего общего с Вопросом, и его обычно следует избегать. - person Basil Bourque; 21.09.2019
comment
Для часового пояса Ла-Пас используйте более правильный ZoneId.of("America/La_Paz"). Для сегодняшних дат это даст тот же результат, но, возможно, не для исторических дат или дат в будущем. - person Ole V.V.; 22.09.2019

person    schedule
comment
Опишите, пожалуйста, ваш ответ - person smilyface; 17.01.2020