IT이야기

Threaten, LocalDate를 사용하여 월의 처음 및 마지막 날짜 가져오기

cyworld 2022. 4. 21. 21:46
반응형

Threaten, LocalDate를 사용하여 월의 처음 및 마지막 날짜 가져오기

나는 이달의 첫날과 마지막 날을 받아야 하는 LocalDate가 있어.그걸 어떻게 하는 거죠?

예를 들어13/2/2014나는 받아야 한다1/2/2014그리고28/2/2014LocalDate 형식으로.

Threaten LocalDate 클래스 사용.

그냥 사용해withDayOfMonth그리고lengthOfMonth():

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

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 month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end   = month.atEndOfMonth();

당월의 첫 번째 및 마지막 날에 대해, 이 값은 다음과 같이 된다.

LocalDate start = YearMonth.now().atDay(1);
LocalDate end   = YearMonth.now().atEndOfMonth();

존 스키츠의 대답은 옳고 나의 업보트를 받을만 하다. 단지 완성도를 위해 약간 다른 해결책을 추가했을 뿐이다.

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

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
 LocalDate monthstart = LocalDate.of(year,month,1);
 LocalDate monthend = monthstart.plusDays(monthstart.lengthOfMonth()-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);
    }
LocalDate endDate = startDate.withDayOfMonth(1).plusMonths(1).minusDays(1);

또는

    LocalDate startDate = LocalDate.now();
    System.out.println("startDate: "+startDate);
    
    LocalDate firstDayOfMonth_of_startDate = startDate.withDayOfMonth(1); 
    System.out.println("firstDayOfMonth_of_startDate: "+firstDayOfMonth_of_startDate);
    
    LocalDate firstDayOfNextMonth_of_startDate = firstDayOfMonth_of_startDate.plusMonths(1); 
    System.out.println("firstDayOfNextMonth_of_startDate: "+firstDayOfNextMonth_of_startDate);
    
    LocalDate lastDayOfTheMonth_of_startDate = firstDayOfNextMonth_of_startDate.minusDays(1); 
    System.out.println("lastDayOfTheMonth_of_startDate: "+lastDayOfTheMonth_of_startDate);

    // or everything in one line
    LocalDate endDate = startDate.withDayOfMonth(1).plusMonths(1).minusDays(1);
    System.out.println("endDate: "+endDate);

그리고 인쇄물

startDate: 2021-11-05
firstDayOfMonth_of_startDate: 2021-11-01
firstDayOfNextMonth_of_startDate: 2021-12-01
lastDayOfTheMonth_of_startDate: 2021-11-30
endDate: 2021-11-30

사용자 지정 날짜를 표시하지 않고 현재 달의 시작 및 종료 날짜를 표시해야 하는 경우:

    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

그러나 이 달의 마지막 날에 대한 또 다른 해결책은 다음과 같다.

나는 다양한 선택지를 가지고 놀면서 배우고자 하는 학습자들을 위해 이 답을 썼다.나는 그것을 생산용으로 추천하지 않는다.

import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        //Test
        System.out.println(lastDateOfMonth(LocalDate.of(2014, 1, 13)));
        System.out.println(lastDateOfMonth(LocalDate.of(2014, 2, 13)));
        System.out.println(lastDateOfMonth(LocalDate.of(2016, 2, 13)));
        System.out.println(lastDateOfMonth(LocalDate.of(2014, 4, 13)));
    }
    
    static LocalDate lastDateOfMonth(LocalDate date) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .parseDefaulting(ChronoField.DAY_OF_MONTH, 31)
                                .appendPattern("uuuu-MM")
                                .toFormatter(Locale.ENGLISH);
        return LocalDate.parse(YearMonth.from(date).toString(), dtf);
    }
}

출력:

2014-01-31
2014-02-28
2016-02-29
2014-04-30

ONLINE DEMO

어떻게 되는 겁니까?

함수는 형식의 문자열을 반환하고uuuu-MM, 내가 사용했던 포맷은DateTimeFormatterBuilder월 최대 일수인 31일까지 디폴트 해놨는데, 이게 모든 달 동안 작동되는 겁니다.

Trail: Date Time에서 최신 Date-Time API* 대해 자세히 알아보십시오.


* Android 프로젝트에서 작업 중인데 Android API 수준이 여전히 Java-8과 호환되지 않는 경우 Disugaring을 통해 Java 8+ API를 확인하십시오.Android 8.0 Oreo는 이미 에 대한 지원을 제공한다는 점에 유의하십시오. 사용 방법을 알아보려면 이 답변과 이 답변을 확인하십시오.java.timeJDBC를 사용한 API.

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

다음을 시도해 보십시오.

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를 처리해야 함

그 매개변수는 윤년을 나타낸다.

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

참조URL: https://stackoverflow.com/questions/22223786/get-first-and-last-day-of-month-using-threeten-localdate

반응형