Java 8将文本日期解析为毫秒时间戳的最佳方法

时间:2017-06-23 02:07:01

标签: java thread-safety

我想创建一个带有线程安全静态方法的Java类来解析日期。我知道一些Java 7(及更早版本)的日期时间类不是线程安全的。 Java 8中此功能的最佳线程安全实现是什么:

S8TZaYb0dFL72A4ZwMKRxlUxmuwhq4UtLQhCCRR584SZ4XwIiQ0fIWu6WptauZ2V
b6wkMN2RtC0g67Wi2oHSYaDAZvyX2ECW98MiczoTHWKTxSK6s3bx9eLq9fkkqtKy

在Java 7及更早版本中,您可以这样做:

String text = "5/16/2008";
long timestamp = DateUtil.getTimestamp(text);

但是,不是为每个调用创建public class DateUtil { public static long getTimestamp(String text) { DateFormat df = new SimpleDateFormat("M/d/yyyy"); df.setTimeZone(TimeZone.getTimeZone("America/New_York")); long timestamp = df.parse(text).getTime(); return timestamp; } } 的新实例,而是希望为所有对此静态DateFormat方法的调用共享一个静态实例。我的理解是,这不是线程安全的。

一个关键要求是我要解析的文本有一个短日期,如“5/16/2008”,没有HH:mm:ss分辨率。

我也不想使用像Joda-Time这样的第三方库,而只是使用标准的Java 8类。

1 个答案:

答案 0 :(得分:0)

正如ck1的回答所述,java.time API的使用是比传统类更好的方法。 DateTimeFormatter是不可变且线程安全的,并且使用它的静态最终实例将解决您的问题。 我与答案不同的唯一部分是代码,其中Date类用于获取时间。我也想在这里采用java.time方法。以下是我的版本:

public class DateUtil {

    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy");

    public static long getTimestamp(String text) {
        LocalDate localDate = LocalDate.parse(text, formatter);
        return Instant.from(localDate.atStartOfDay(ZoneId.systemDefault())).toEpochMilli();
    }

    public static void main(String[] args) {
        String text = "5/16/2008";
        long timestamp = DateUtil.getTimestamp(text);
        System.out.println(timestamp);
    }
}