我有一个LocalDate,需要获取该月的第一天和最后一天。我怎么做?
例如。13/2/2014
我需要1/2/2014
和28/2/2014
在LOCALDATE的格式。
使用threeten LocalDate类。
我有一个LocalDate,需要获取该月的第一天和最后一天。我怎么做?
例如。13/2/2014
我需要1/2/2014
和28/2/2014
在LOCALDATE的格式。
使用threeten LocalDate类。
Answers:
该API旨在支持与业务需求紧密匹配的解决方案
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
但是,乔恩的解决方案也很好。
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();
LocalDate
with
方法相比有什么优点?
LocalDate
实例开始。
乔恩·斯凯特(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());
如果有人来寻找前一个月的第一天,和上月的最后一天:
public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
return date.minusMonths(1).withDayOfMonth(1);
}
public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
return date.withDayOfMonth(1).minusDays(1);
}
您可以尝试这样做以避免显示自定义日期,以及是否需要显示当前月份的开始日期和结束日期:
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
试试这个:
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方法
该参数表示leap年
getLastDayOfMonth
-有关更简单方法的信息,请参见我的答案。
如果您只想对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);
只是在这里展示我对@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();
}
LocalDateTime
在这里使用的类是完全错误的。您正在丢弃有价值的区域/偏移量信息。
Date
与问题无关,通常应避免使用。
ZoneId.of("America/La_Paz")
。对于当前日期,它将给出相同的结果,但对于历史日期或将来的日期可能不会。