2017-06-23 23 views
1

Ich möchte eine Java-Klasse mit thread-sicheren statischen Methoden erstellen, um Daten zu analysieren. Ich verstehe, dass einige der Java 7 (und früher) Datum-Zeit-Klassen nicht Thread-sicher sind. Was ist die beste Thread-sichere Implementierung in Java 8 diese Funktionalität:Java 8 beste Möglichkeit, Textdatum zu Millisekunden-Zeitstempel zu analysieren

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

In Java 7 und früher, würden Sie dies tun:

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; 
    } 

} 

Aber anstatt eine neue Instanz von DateFormat für die Erstellung von Bei jedem Aufruf möchte ich eine einzige statische Instanz für alle Aufrufe dieser statischen getTimestamp-Methode freigeben. Mein Verständnis ist, dass dies nicht Thread-sicher ist.

Eine wichtige Voraussetzung ist, dass der Text, den ich analysieren möchte, ein kurzes Datum wie "5/16/2008" ohne HH: mm: ss Auflösung hat.

Ich möchte auch keine Drittanbieter-Bibliothek wie Joda-Time, sondern nur Standard-Java-8-Klassen verwenden.

+0

Die Joda-Time-Bibliothek von Drittanbietern wurde (hauptsächlich) in Java-8-Standardklassen in den 'java.time. *' - Paketen erstellt. –

Antwort

4

Hier ist eine Version des Codes das java.time.* Paket in Java 8. Es verwendet eine static final Formatierer Instanz verwenden Refactoring, das Thread-sicher und unveränderlich ist, im Gegensatz zu java.text.SimpleDateFormat.

import java.time.LocalDate; 
import java.time.ZoneId; 
import java.time.format.DateTimeFormatter; 
import java.util.Date; 

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 Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()).getTime(); 
    } 
} 
0

Sie können joda-time lib verwenden. DateTime ist unveränderlich - und nach der Erstellung ändern sich die Werte nicht, so dass die Klasse sicher weitergegeben und in mehreren Threads ohne Synchronisation verwendet werden kann.
Eine begleitende veränderbare Klasse zu DateTime ist MutableDateTime, von der die Klasse geändert werden kann und nicht Thread-sicher ist.

DateTimeFormatter formatter = DateTimeFormat.forPattern("M/d/yyyy'T'HH:mm:ss.SSSZZ") 
    .withLocale(Locale.ROOT).withChronology(ISOChronology.getInstanceUTC()); 
DateTime dt = formatter.parseDateTime(text); 

Referenz von DateTimeFormatt: DatetimeFormat api.

0

Wie in der Antwort von ck1 angegeben, ist die Verwendung der API java.time ein besserer Ansatz als die älteren Klassen. ist unveränderlich und Thread-sicher, und die Verwendung einer statischen letzten Instanz davon wird Ihr Problem lösen. Der einzige Teil, wo ich von dieser Antwort abweichen, ist im Code, wo die Date Klasse verwendet wird, um die Zeit zu bekommen. Ich würde gerne den Ansatz java.time hier auch nehmen. Hier ist meine Version:

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); 
    } 
} 
Verwandte Themen