首先说业务需求,我的业务是从数据库查询创建、修改、添加时间的等字段的信息返回给一个临时的Bean对象,这个Bean对象一开始我设计的字段是Date类型,debug的时候发现这个Bean时间字段显示不友好,为此有了下面的使用
Date
Date如果不格式化,打印出的日期可读性差
Tue Sep 10 09:34:04 CST 2019
使用SimpleDateFormat对时间进行格式化,但SimpleDateFormat是线程不安全的,具体可看源代码
private StringBuffer format(Date date, StringBuffer toAppendTo,
FieldDelegate delegate) {
// Convert input date to time field list
calendar.setTime(date);
boolean useDateFormatSymbols = useDateFormatSymbols();
for (int i = 0; i < compiledPattern.length; ) {
int tag = compiledPattern[i] >>> 8;
int count = compiledPattern[i++] & 0xff;
if (count == 255) {
count = compiledPattern[i++] << 16;
count |= compiledPattern[i++];
}
switch (tag) {
case TAG_QUOTE_ASCII_CHAR:
toAppendTo.append((char)count);
break;
case TAG_QUOTE_CHARS:
toAppendTo.append(compiledPattern, i, count);
i += count;
break;
default:
subFormat(tag, count, delegate, toAppendTo, useDateFormatSymbols);
break;
}
}
return toAppendTo;
}
多线程并发如何保证线程安全
避免线程之间共享一个SimpleDateFormat对象,每个线程使用时都创建一次SimpleDateFormat对象 => 创建和销毁对象的开销大
对使用format和parse方法的地方进行加锁 => 线程阻塞性能差
使用ThreadLocal保证每个线程最多只创建一次SimpleDateFormat对象 => 较好的方法
LocalDate、LocalTime、LocalDateTime
创建LocalDate 只获取某年某月
创建LocalTime只能获取时分秒
LocalDateTime = LocalDate + LocalTime
这些都是Java的新的APOI,感兴趣的可以深入了解一下,和SimpleDateFormat相比,除了API调用更为简单,还有DateTimeFormatter是线程安全的
这篇博客讲述了在处理日期时间时遇到的问题,包括Date类型的可读性问题以及在多线程环境下SimpleDateFormat的线程安全性。作者探讨了使用SimpleDateFormat的线程安全解决方案,如ThreadLocal。此外,还介绍了Java新日期时间API的LocalDate、LocalTime和LocalDateTime,指出它们在API简洁性和线程安全性上的优势。

8444

被折叠的 条评论
为什么被折叠?



