πŸ’» Programming/Java

[Java] Convert timestamp(long) to date time string format and vice versa

μΌ€μ΄μΉ˜ 2020. 1. 10. 16:22

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으둜 λ³€ν™˜ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

μœ μš©ν–ˆλ‹€λ©΄ 곡감 κΎΉ λΆ€νƒν•΄μš”~