线程安全日期解析器

时间:2011-01-11 14:17:53

标签: java date thread-safety

我正在寻找SimpleDateFormat的线程安全替代品。旧版parseObject上的FastDateFormat未实现,只会引发错误。有任何想法吗?我不需要任何花哨的东西,只需要线程安全性和处理这种模式的能力:"yyyy-MM-dd"

5 个答案:

答案 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

java.time 类型是 thread-safejava.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

ONLINE DEMO

现代日期时间 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 desugaringHow 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);
 }
}