我想创建一个带有线程安全静态方法的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类。
答案 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);
}
}