Mình từng nghĩ format date là một công việc đơn giản và có thể viết pure function là được. Cho đến khi mình gặp lỗi khi dùng 1 instance java.text.SimpleDateFormat
trong multithreading:
java.lang.NumberFormatException: For input string: "E.420242024E4"
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.base/java.lang.Double.parseDouble(Double.java:651)
at java.base/java.text.DigitList.getDouble(DigitList.java:169)
at java.base/java.text.DecimalFormat.parse(DecimalFormat.java:2202)
at java.base/java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1937)
at java.base/java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1545)
at java.base/java.text.DateFormat.parse(DateFormat.java:397)
----
java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Long.parseLong(Long.java:721)
at java.base/java.lang.Long.parseLong(Long.java:836)
at java.base/java.text.DigitList.getLong(DigitList.java:195)
at java.base/java.text.DecimalFormat.parse(DecimalFormat.java:2197)
at java.base/java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1937)
at java.base/java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1545)
at java.base/java.text.DateFormat.parse(DateFormat.java:397)
Mình không muốn đào sâu xem nó lưu và sửa property nào trong object formater. Giải pháp là 1 SimpleDateFormat instance chỉ dùng cho 1 thread. Hoặc nếu dùng Java 8 trở đi thì đơn giản hơn là chuyển sang dùng
java.time.format.DateTimeFormatter
.