코딩 기록들

[Java Programming] 14.1 LocalDateTime 본문

Java

[Java Programming] 14.1 LocalDateTime

코딩펭귄 2024. 2. 5. 11:16

java 1.8 이후 Calendar 대체하기위해 날짜,시간,날짜시간을 처리할 수 있는 클래스가 3개 추가됨

 

 

DateTimeFormatter.ofPattern("yyyy년 MM월 dd일") : 현재시간을 문자타입으로 바꿔줌

LocalDate

- 날짜조회

- LocalDate.now : 현재시간

LocalTime

- 시분초만 관리가능 -> 쓸 일 별로 없음(업무시작 ~ 업무끝 시간 관리 정도)

LocalDateTime (LocalDate + LocalTime)

- 년 원 일 시 분 초  다 다룰수 있음

- 자바 1.8부터 : 날짜와 날짜사이의 차이를 구할 수 있다 Period.between(startDate, endDate);

- 현재말고 과거나 미래의 시간을 가져오고 싶을 떄 : LocalDate.of(2022, 1, 1) / period.between

 

LocalDate 예제

public class LocalDateExam {

	public static void main(String[] args) {
		
		LocalDate nowDate = LocalDate.now();
		DateTimeFormatter dateFormatter =
				//DateTimeFormatter : 현재시간을 문자타입으로 바꿔줌
				DateTimeFormatter.ofPattern("yyyy년 MM월 dd일");
		String strNowDate = dateFormatter.format(nowDate);
		System.out.println(nowDate); //2024-02-05
		System.out.println(strNowDate); //2024년 02월 05일

		nowDate = LocalDate.of(2022, 1,1);
		nowDate = nowDate.plusDays(10);
		nowDate = nowDate.plusMonths(2);
		nowDate = nowDate.plusYears(3);
		dateFormatter =
				DateTimeFormatter.ofPattern("yyyy년 MM월 dd일");
		strNowDate = dateFormatter.format(nowDate);
		System.out.println(nowDate); //2025-03-11
		System.out.println(strNowDate); //2025년 03월 11일
		
		//날짜와 날짜사이 차이 구하기
		// 티켓팅 할 때 '오픈 ~시간 ~초 전' 알려줄때 사용가능
		LocalDate startDate = LocalDate.of(2022,  1, 1);
		LocalDate endDate = LocalDate.of(2023,  5, 20);
		Period between = Period.between(startDate, endDate);
		System.out.println(between.getYears() + "," 
							+ between.getMonths() + "," 
								+ between.getDays());
	}
}

 

LocalTime 예제 (잘 안씀)

public class LocalTimeExam {

	public static void main(String[] args) {
		
		LocalTime nowTime = LocalTime.now();
		DateTimeFormatter timeFormatter = 
				DateTimeFormatter.ofPattern("HH시 mm분 ss초");
		String strNowTime = timeFormatter.format(nowTime);
		System.out.println(nowTime); //09:37:26.154997400
		System.out.println(strNowTime); //09시 37분 26초

		nowTime = LocalTime.of(00, 00, 01); //00시00분01초 에서 더하기
		nowTime = nowTime.plusHours(10);
		nowTime = nowTime.plusMinutes(5);
		nowTime = nowTime.plusSeconds(55);
		timeFormatter = 
				DateTimeFormatter.ofPattern("HH시 mm분 ss초");
		strNowTime = timeFormatter.format(nowTime);
		System.out.println(nowTime); // 10:05:56
		System.out.println(strNowTime); // 10시 05분 56초	
	}
}

 

LocalDateTime 예제

public class LocalDateTimeExam {

	public static void main(String[] args) {
		
		LocalDateTime nowDateTime = LocalDateTime.now();
		DateTimeFormatter dateTimeFormatter = 
				DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
		
		String strNowDateTime = dateTimeFormatter.format(nowDateTime);
		
		System.out.println(nowDateTime); // 2024-02-05T09:32:13.327533200
		System.out.println(strNowDateTime); //2024-02-05 09:32:13

		
		nowDateTime = LocalDateTime.of(2022, 2, 1, 11, 39, 11);
		nowDateTime = nowDateTime.plusDays(10);
		nowDateTime = nowDateTime.plusMonths(10);
		nowDateTime = nowDateTime.plusYears(20);
		nowDateTime = nowDateTime.plusHours(30);
		nowDateTime = nowDateTime.plusMinutes(40);
		nowDateTime = nowDateTime.plusSeconds(50);

		dateTimeFormatter = 
				DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
		strNowDateTime = dateTimeFormatter.format(nowDateTime);
		System.out.println(nowDateTime);  //2042-12-12T18:20:01
		System.out.println(strNowDateTime); //2042-12-12 18:20:01
	}
}

 

 

달력만들기 예제

public class MakingCalendar {
	/**
	 * 전달받은 날짜의 첫번째 날짜부터 마지막날짜까지를 출력 (요일포함) - 날짜핸들링 연습
	 * @param date 기준이 되는 날짜
	 */
	public static void printCalendar(LocalDate date) {
		//1st. date 인스턴스를 YearMonth로 변경
		YearMonth yearMonth = YearMonth.from(date); //년,월이 나옴
		
		//2nd. 첫번째 날짜를 구한다
		LocalDate firstDay = yearMonth.atDay(1); //전달받은 날짜가 언제인지에 상관없이 첫째날구하기
		
		//3rd. date 인스턴스의 월의 총 길이(며칠) 구한다
		int days = date.lengthOfMonth();
		
		//4th. 반복하며 날짜와 요일을 출력한다
		System.out.println(firstDay);
		System.out.println(firstDay.getDayOfWeek().name());
		for (int i = 0; i < days-1; i++) {
			firstDay = firstDay.plusDays(1);
			System.out.println(firstDay);
			System.out.println(firstDay.getDayOfWeek().name());
		}
		System.out.println("===============================================");
	}

	public static void main(String[] args) {

		printCalendar(LocalDate.now());
//		LocalDate now = LocalDate.now();
		//현재시간도 입력해보기
		LocalDate now = LocalDate.of(2024, 1, 15);
		
		//현재요일
		System.out.println(now.getDayOfWeek().name()); //LocatDate, LocalDateTime 사용
		
		YearMonth yearMonth = YearMonth.from(now);
		//이번달의 첫번째 날 구하기
		LocalDate firstDay = yearMonth.atDay(1); // LocalDate, LocalDateTime 사용
		System.out.println(firstDay);
		System.out.println(firstDay.getDayOfWeek().name());
		
		//이번달의 마지막날 구하기
		LocalDate lastDay = yearMonth.atEndOfMonth(); // LocalDate, LocalDateTime 사용
		System.out.println(lastDay);
		System.out.println(lastDay.getDayOfWeek().name());
		
		//이번달은 총 며칠인지 구하기
		int lengthOfDays = now.lengthOfMonth(); // LocalDate 사용
		System.out.println(lengthOfDays);
		
		//이번해는 총 며칠인지 구하기
		int lengthOfYears = now.lengthOfYear(); // LocalDate 사용
		System.out.println(lengthOfYears);
	}
}

 

배송완료(영업일기준) 메세지 예제

	/**
	 * 금일을 제외한, '가장 가까운 다음 영업일' 구하기
	 * @param localDate 오늘
	 * @return
	 */
	public static Map<String, Object> getClosestWorkingDay(LocalDate localDate) {
		
		//0. localDate에 하루를 더한다
		localDate = localDate.plusDays(1);
		
		//1st. 오늘의 요일을 구한다
		DayOfWeek dayOfWeek = localDate.getDayOfWeek();
		
		int dayCount = 1; // ~일 뒤에 배송됩니다' 를 알려주기 위해
		
		
		//2nd. 하루를 더한 날짜가 휴일인지 검사한다
		while(dayOfWeek == DayOfWeek.SATURDAY 
				|| dayOfWeek == DayOfWeek.SUNDAY) {
			//3rd. 만약 휴일이라면 하루를 더 더한다
			localDate = localDate.plusDays(1);
			dayOfWeek = localDate.getDayOfWeek();
			dayCount++;
		}		
		
		//반환을 여러개(day, count) 시키고 싶을때 : 컬렉션 사용! Map
		Map<String, Object> result = new HashMap<>();
		result.put("workingDay", localDate);
		result.put("dayCount", dayCount);
		
		//4th. 만약 휴일이 아니라면 더한 결과를 반환한다
		return result; 
	}
	
	public static void main(String[] args) {
		
		Map<String, Object> closestWorkingDay = getClosestWorkingDay(LocalDate.now());
		System.out.println(closestWorkingDay.get("workingDay") + "일에 배송이 완료됩니다.");
		System.out.println(closestWorkingDay.get("dayCount") + "일 뒤에 배송이 완료됩니다.");
		System.out.println("===============================================");

		closestWorkingDay = getClosestWorkingDay(LocalDate.of(2024, 2, 9)); //금요일
		System.out.println(closestWorkingDay.get("workingDay") + "일에 배송이 완료됩니다."); //2월 12일 (월요일)
		System.out.println(closestWorkingDay.get("dayCount") + "일 뒤에 배송이 완료됩니다.");
		System.out.println("===============================================");
	}

 

*날짜핸들링은 이러렇게 전부 utility로 만든다*

 

 

Calendar와 LocatDateTime의 차이
  Calendar LocalDateTime
월 처리 시 의도적으로 +1, -1 을 해줘야함 필요없음
년원일시분초 가져올 때  'get'을 통해 가져와야함 필요없음
시간만 or 날짜만 필요할 경우 우선 한꺼번에 다 가져와야함
(-> calendar 수행 속도가 더 느림)
시간만 필요할경우 LocalTime만,
날짜만 필요할경우 LocalDate만 사용
날짜와 날짜사이의 차이 구하기 불가능 가능 (between)
현재말고 과거나 미래의 시간을
가져오고 싶을 떄
- 가능  LocalDate.of(2022, 1, 1)
날짜정보 전달 형태 숫자로  문자로