코딩 기록들
[Java Programming] 14.1 LocalDateTime 본문
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) |
날짜정보 전달 형태 | 숫자로 | 문자로 |
'Java' 카테고리의 다른 글
[Java Programming] 12.2 NIO (Java1.8 이후 File I/O ) , 재귀호출 (0) | 2024.02.02 |
---|---|
[Java Programming] 13.1 Enum (0) | 2024.02.02 |
[Java Programming] 13.2 Calendar (0) | 2024.02.02 |
[Java Programming] 12.1 File I/O (0) | 2024.02.01 |
[Java Programming] 11.2 컬렉션 (ListArray, Map, HashMap, set) (1) | 2024.02.01 |