Converting timestamp to date time string format and vice versa
์ค์ ์ ๋ฌด์์ 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
Summary
์ด๋ฒ ํฌ์คํ ์์๋ ์๋ฐ์์ 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์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
์ ์ฉํ๋ค๋ฉด ๊ณต๊ฐ ๊พน ๋ถํํด์~