使用threeten,LocalDate获取每月的第一天和最后一天

时间:2014-03-06 11:55:49

标签: java date java-time

我有一个LocalDate需要获取该月的第一天和最后一天。 我该怎么做?

例如。 13/2/2014 我需要以LocalDate格式获得1/2/2014和28/2/2014。

使用threeten LocalDate类。

10 个答案:

答案 0 :(得分:137)

只需使用withDayOfMonthlengthOfMonth()

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.lengthOfMonth());

答案 1 :(得分:119)

API旨在支持与业务要求紧密匹配的解决方案

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

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

然而,Jon的解决方案也很好。

答案 2 :(得分:35)

YearMonth

为了完整性,我认为更优雅,请参阅YearMonth类的使用。

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

答案 3 :(得分:15)

Jon Skeets的答案是正确的,并且应该得到我的支持,只需添加这个略有不同的完整性解决方案:

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

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

答案 4 :(得分:3)

 LocalDate monthstart = LocalDate.of(year,month,1);
 LocalDate monthend = monthstart.plusDays(monthstart.lengthOfMonth()-1);

答案 5 :(得分:1)

试试这个:

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

你可以找到欲望输出,但是需要为 getLastDayOfMonth 方法>处理参数 true / false

该参数表示闰年

答案 6 :(得分:1)

如果有人来找上个月的第一天上个月的最后一天

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


public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
        return date.withDayOfMonth(1).minusDays(1);
    }

答案 7 :(得分:0)

如果您只想对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);

答案 8 :(得分:0)

这里只是展示我对@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();
}

答案 9 :(得分:0)

您可以尝试避免显示自定义日期,以及是否需要显示当前月份的开始日期和结束日期:

    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