我正在寻找SimpleDateFormat
的线程安全替代品。旧版parseObject
上的FastDateFormat
未实现,只会引发错误。有任何想法吗?我不需要任何花哨的东西,只需要线程安全性和处理这种模式的能力:"yyyy-MM-dd"
。
答案 0 :(得分:13)
如果可能,请使用Joda Time。它的日期/时间解析器是线程安全的,它通常是一个比Date
/ Calendar
更好的 更好的API。
你可以只使用其解析器,然后将返回值转换为Date
,但我个人建议使用整个库。
答案 1 :(得分:8)
如this post中所述,您可以同步,使用线程本地或Joda-Time。
例如,使用ThreadLocals:
public class DateFormatTest {
private static final ThreadLocal<DateFormat> df
= new ThreadLocal<DateFormat>(){
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyyMMdd");
}
};
public Date convert(String source)
throws ParseException{
Date d = df.get().parse(source);
return d;
}
}
答案 2 :(得分:3)
java.time
类型是 thread-safe。 java.time
API(modern Date-Time API*)自 2014 年 3 月起作为 Java SE 8 标准库的一部分出现。
下面引用的是来自 home page of Joda-Time 的通知:
<块引用>请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。
演示:
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
String strDate = "2021-06-13";
LocalDate date = LocalDate.parse(strDate);
System.out.println(date);
}
}
输出:
2021-06-13
现代日期时间 API 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用 DateTimeFormatter
对象。您可能已经注意到,我在上面的代码中没有使用解析类型 (DateTimeFormatter
),因为 yyyy-MM-dd
也是日期的 ISO 8601 模式。
从 Trail: Date Time 了解有关现代 Date-Time API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
答案 3 :(得分:1)
为什么不将SimpleDateFormat.parseObject()
的电话放入您自己的synchronized
区块?
答案 4 :(得分:1)
找到solution。
public class ThreadSafeSimpleDateFormat {
private DateFormat df;
public ThreadSafeSimpleDateFormat(String format) {
this.df = new SimpleDateFormat(format);
}
public synchronized String format(Date date) {
return df.format(date);
}
public synchronized Date parse(String string) throws ParseException {
return df.parse(string);
}
}