자바 8부터 제공되는 java.time 패키지의 날짜와 관련된 클래스를 사용하면 쉽게 날짜 계산을 할 수 있습니다.
* 아래 제 포스팅을 참고하시면 다양한 기능을 만날 수 있습니다. : )
https://lts0606.tistory.com/257
이번에 필요하였던 기능은 날짜와 관련된 값을 밀리세컨드로 바꾸는 기능이였습니다.
아래 코드처럼 메소드를 호출하면 쉽게 값을 가져올 수 있습니다.
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
public class TestClass {
public static void main(String[] args) {
LocalDateTime.now().atZone(ZoneId.of("Asia/Seoul")).toInstant().toEpochMilli();
}
}
LocalDateTime, LocalDate, YearMonth 등등 java.time 패키지의 날짜와 관련된 클래스에서 atZone이라는 메소드가 공통으로 존재 합니다.
해당 메소드는 ChronoLocalDateTime라는 인터페이스를 위에 언급한 날짜와 관련된 각각의 클래스들이 상속받아 공통으로 구현된 기능 입니다.
그러므로 날짜와 관련된 클래스에서 atZone이라는 메소드를 호출하여 ZoneId값을 넣어주고 toInstant메소드 호출, toEpochMilli메소드를 호출하는 단계로 밀리세컨드값을 구할 수 있습니다.
* 볼 때마다 멋진 자바의 상속기능 입니다...
아래 이해를 위해 샘플 코드를 좀 더 추가하여 보았습니다.
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.DayOfWeek;
import java.time.temporal.TemporalAdjusters;
public class TestClass {
public static void main(String[] args) {
//사용할 zone 아이디 값 입니다.
ZoneId zoneid = ZoneId.of("Asia/Seoul");
//#1. 현재 시간의 값 밀리세컨드 변환
LocalDateTime.now().atZone(zoneid).toInstant().toEpochMilli();
//#2. 1달전 일자의 시작일과 마지막일 변환
LocalDate beforMonth = LocalDate.now().minusMonths(1);
long beforMonthA = beforMonth.withDayOfMonth(1).atStartOfDay().atZone(zoneid).toInstant().toEpochMilli();
long beforMonthB = beforMonth.withDayOfMonth(beforMonth.lengthOfMonth()).atStartOfDay().atZone(zoneid).toInstant().toEpochMilli();
System.out.println("/**");
System.out.println("저번달 시작 : " + beforMonthA);
System.out.println("저번달 종료 : " + beforMonthB);
//#3. 특정 일자의 시작일과 마지막일 변환
LocalDate parseMonth = LocalDate.parse("2021-01-01");
long parseMonthA = parseMonth.atStartOfDay().atZone(zoneid).toInstant().toEpochMilli();
long parseMonthB = parseMonth.withDayOfMonth(parseMonth.lengthOfMonth()).atStartOfDay().atZone(zoneid).toInstant().toEpochMilli();
System.out.println("파싱달 시작 : " + parseMonthA);
System.out.println("파싱달 종료 : " + parseMonthB);
System.out.println("**/");
//#4. 해당 시작주의 첫번째 일자 값, 마지막 일자 값
long stime = LocalDate.now().atStartOfDay().with(DayOfWeek.MONDAY).atZone(zoneid).toInstant().toEpochMilli();
long etime = LocalDate.now().atStartOfDay().with(DayOfWeek.SUNDAY).atZone(zoneid).toInstant().toEpochMilli();
//#5. 다양한 사용 방법(참고 : blog.eomdev.com)
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime time = nowTime
.with(TemporalAdjusters.firstDayOfYear()) // 이번 년도의 첫 번째 일(1월 1일)
.with(TemporalAdjusters.lastDayOfYear()) // 이번 년도의 마지막 일(12월 31일)
.with(TemporalAdjusters.firstDayOfNextYear()) // 다음 년도의 첫 번째 일(1월 1일)
.with(TemporalAdjusters.firstDayOfMonth()) // 이번 달의 첫 번째 일(1일)
.with(TemporalAdjusters.lastDayOfMonth()) // 이번 달의 마지막 일
.with(TemporalAdjusters.firstDayOfNextMonth()) // 다음 달의 첫 번째 일(1일)
.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)) // 이번 달의 첫 번째 요일(여기서는 월요일)
.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)) // 이번 달의 마지막 요일(여기서는 마지막 금요일)
.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)) // 다음주 금요일
.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY)) // 다음주 금요일(오늘 포함. 오늘이 금요일이라면 오늘 날짜가 표시 된다.)
.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY)) // 지난주 금요일
.with(TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY));// 지난주 금요일(오늘 포함)
}
}
해당 년월의 시작일자, 마지막일자 값을 가져오게 한 뒤에 밀리세컨드로 표현하여 보았습니다.
이제 필요한 것은 진짜 잘 되었는지 검증하는 것 입니다.
자바스크립트를 활용하여 해당 값이 맞는지 한번 확인하여 봅니다.
브라우저를 열어서 new Date() 함수에 밀리세컨드 값을 넣어주었습니다.
내용이 이상없이 잘 출력되는 것을 볼 수 있습니다.
이상으로 자바를 활용하여 날짜 값을 밀리세컨드 값으로 변환하는 방법에 대해서 살펴 보았습니다.
문의사항 또는 틀린부분은 댓글 또는 메일로 연락하여 주세요! 👻
'Java(자바) > Java 기본' 카테고리의 다른 글
자바로 살펴본 재귀 함수의 동작 방법 - 2 (Java Recursive method with 순열) (2) | 2021.07.28 |
---|---|
자바로 살펴본 재귀 함수의 동작 방법 - 1 (Java Recursive method) (2) | 2021.07.27 |
Java 모듈(Java module, 자바 모듈, 자바 module) with SpringBoot (0) | 2021.01.06 |
Java 11 HttpClient (자바11 HttpClient) 기능 살펴 보기 (0) | 2020.12.28 |
Java SpotBugs 정적 분석 도구(Java 취약점검, 자바 취약점검) (0) | 2020.12.16 |
댓글