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์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

์œ ์šฉํ–ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๊พน ๋ถ€ํƒํ•ด์š”~