실제 업무에서 java로 프로그래밍 할 때 날짜/시간을 다뤄야 할 때가 참 많습니다.
데이터 업데이트 시간을 기록하거나 로깅을 하거나 등등 말이죠.
그래서 오늘은 시간 변환에 대해서 짧게 한가지만 알려드립니다.
자바 프로그래밍을 시작한지 얼마 안되었을 때 System.currentTimemillis()를 이용해서 내가 작성한 알고리즘이 얼마나 빨리 돌아가는지 확인을 했었는데요, 저 함수의 결과는 long형입니다.
1970년 1월 1일 UTC 자정 이후로 몇 밀리초가 지났는지를 반환해주죠.
반환값에 대한 정확한 정의는 아래와 같습니다.
* @return the difference, measured in milliseconds, between
* the current time and midnight, January 1, 1970 UTC.
그런데 이 long형 숫자는 길이도 길고 이게 도대체 그래서 몇 일 몇 시 라는 건지를 알아보기가 힘들죠
그래서 이 long형 숫자를 가독성있게 우리가 일반적으로 사용하는 시간 포맷에 맞게 String 타입으로 변환하려면 어떻게 해야 할까요? 그리고 그렇게 얻은 String 타입 시간값을 다시 long형으로 변환하려면 또 어떻게 해야 할까요?
우선 long타입 시간을 원하는 일시 포맷으로 변경하는 것은 Date와 SimpleDateFormat을 이용하면 쉽게 변환할 수 있습니다. 아래와 같이 말이죠.
public static void main(String[] args) {
Date d = new Date(vv);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String bb = format.format(d);
System.out.println(bb);
}
반대로 String으로 된 일시를 long으로 변환할 때는 아래와 같이 java.sql.Timestamp를 이용하면 쉽게 변환이 가능합니다.
public static void main(String[] args) {
String prdt = "2020-01-10 10:38:09.419";
long vv = Timestamp.valueOf(prdt).getTime();
System.out.println(vv);
}
하지만 Timestamp.valueOf(String) 메서드는 "yyyy-mm-dd hh:mm:ss[.fffffffff]" 형태의 string만 입력 가능합니다.
일자만 있거나 시간값만 있으면 사용이 불가능 하다는 것 명심하세요.
만약 일시 포맷을 잘못 입력하면 아래와 같은 오류가 발생합니다.
Exception in thread "main" java.lang.IllegalArgumentException:
Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
java.sql.Timestamp 대신에 LocalDateTime을 이용할 수도 있습니다.
public static void main(String[] args) {
String prdt2 = "2020-01-11 00:00:00";
System.out.println(Timestamp.valueOf(prdt2).getTime());
System.out.println(LocalDateTime.parse("2020-01-11T00:00:00")
.atZone(ZoneId.of("Asia/Seoul"))
.toInstant()
.toEpochMilli());
}
---출력결과---
1578668400000
1578668400000
하지만 LocalDateTime의 경우 parse할 때 들어가는 string형태의 일시값에 'T'구분자를 포함해줘야 합니다.
그렇지 않을 경우 아래와 같이 파싱오류가 발생합니다.
Exception in thread "main" java.time.format.DateTimeParseException:
Text '2020-01-11 00:00:00' could not be parsed at index 10
이번 포스팅에서는 자바에서 long타입의 timestampe를 String 타입의 가독성 좋은 형태로 변환하는 작업과 그렇게 변환된 String을 다시 long으로 변경하는 부분에 대해서 알아보았습니다.
long -> String -> long 변경을 했을 때 동일한 값이 나오는지도 아래 테스트를 통해서 확인할 수 있었습니다.
public static void main(String[] args) {
// String to long conversion 1
String prdt = "2020-01-11 10:24:09.419";
long l1 = Timestamp.valueOf(prdt).getTime();
System.out.println(l1);
// String to long conversion 2
String prdt2 = "2020-01-11T10:24:09.419";
long l2 = LocalDateTime.parse(prdt2)
.atZone(ZoneId.of("Asia/Seoul"))
.toInstant()
.toEpochMilli();
System.out.println(l2);
// long to String conversion
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(format.format(new Date(l1)));
}
---출력결과---
1578705849419
1578705849419 <-- Timestamp를 이용해서 얻은 결과와 동일함을 확인
2020-01-11 10:24:09.419 <-- long으로 변환했던 String 형태의 시간과 동일하게 출력되는지 확인
이상으로 Java에서 datetime을 long에서 String으로 다시 String에서 long으로 변환하는 방법에 대해서 알아보았습니다.
유용했다면 공감 꾹 부탁해요~
[Java] 자바 멀티쓰레드에서 로그확인을 위한 uuid 설정하기 (0) | 2020.03.13 |
---|---|
[Java] 자바 ThreadPoolTaskExecutor를 이용하여 비동기 처리하기(멀티쓰레드) (0) | 2020.03.13 |
[Java] 자바 8진수를 10진수로 변환하기 (0) | 2019.06.27 |
[Java] 자바 1차원 배열 생성(선언 및 초기화) (0) | 2019.06.25 |
[우리 아이를 위한 Java 강의 2일차] 무작정 따라하기 (0) | 2019.06.22 |