it-swarm.com.de

Konvertieren Sie ein Datumsformat in Epoche

Ich habe eine Zeichenfolge mit einem Datumsformat wie 

Jun 13 2003 23:11:52.454 UTC

enthält millisec ... was ich in epoch umwandeln möchte. Gibt es in Java ein Dienstprogramm, das ich für diese Konvertierung verwenden kann?

49
user804979

Dieser Code zeigt, wie ein Java.text.SimpleDateFormat verwendet wird, um ein Java.util.Date aus einem String zu analysieren:

String str = "Jun 13 2003 23:11:52.454 UTC";
SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz");
Date date = df.parse(str);
long Epoch = date.getTime();
System.out.println(Epoch); // 1055545912454

Date.getTime() gibt die Epoche in Millisekunden zurück.

84
Bohemian

Sie können auch die neue Java 8-API verwenden

import Java.time.ZonedDateTime;
import Java.time.format.DateTimeFormatter;

public class StackoverflowTest{
    public static void main(String args[]){
        String strDate = "Jun 13 2003 23:11:52.454 UTC";
        DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz");
        ZonedDateTime     zdt  = ZonedDateTime.parse(strDate,dtf);        
        System.out.println(zdt.toInstant().toEpochMilli());  // 1055545912454  
    }
}

Die DateTimeFormatter Klasse ersetzt die alte SimpleDateFormat . Sie können dann eine ZonedDateTime erstellen, aus der Sie die gewünschte Epochenzeit extrahieren können.

Der Hauptvorteil ist, dass Sie jetzt Thread-sicher sind.

Danke an Basil Bourque für seine Anmerkungen und Vorschläge. Lesen Sie seine Antwort für vollständige Details.

20
Ortomala Lokni

tl; dr

ZonedDateTime.parse( 
                        "Jun 13 2003 23:11:52.454 UTC" , 
                        DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" ) 
                    )
              .toInstant()
              .toEpochMilli()

1055545912454

Java.time

Diese Antwort erweitert die Answer by Lockni .

DateTimeFormatter

Definieren Sie zunächst ein Formatierungsmuster für Ihre Eingabe, indem Sie ein DateTimeFormatter -Objekt erstellen.

String input = "Jun 13 2003 23:11:52.454 UTC";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" );

ZonedDateTime

Analysiere den String als ZonedDateTime . Sie können sich diese Klasse wie folgt vorstellen: (Instant + ZoneId).

ZonedDateTime zdt = ZonedDateTime.parse ( "Jun 13 2003 23:11:52.454 UTC" , f );

zdt.toString (): 2003-06-13T23: 11: 52.454Z [UTC]

Count-from-Epoche

Ich empfehle nicht, Datum/Uhrzeit-Werte als Count-from - Epoch zu verfolgen. Dies macht das Debuggen schwierig, da Menschen ein aussagekräftiges Datum und eine Uhrzeit nicht aus einer Zahl unterscheiden können, so dass ungültige/unerwartete Werte vorübergehen können. Auch solche Zählungen sind mehrdeutig, in Granularität (ganze Sekunde, Milli, Mikro, Nano usw.) und in Epoche (mindestens zwei Dutzend in verschiedenen Computersystemen). 

Wenn Sie jedoch darauf bestehen, können Sie aus der Epoche des ersten Moments von 1970 in UTC (1970-01-01T00:00:00) über die Instant -Klasse Millisekunden zählen. Beachten Sie, dass dies Datenverlust bedeutet, wenn Sie Nanosekunden auf Millisekunden verkürzen.

Instant instant = zdt.toInstant ();

instant.toString (): 2003-06-13T23: 11: 52.454Z

long millisSinceEpoch = instant.toEpochMilli() ; 

1055545912454

Über Java.time

Das Java.time -Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die störenden alten Datum-Zeit-Klassen wie Java.util.Date , .Calendar , & Java.text.SimpleDateFormat .

Das Joda-Time -Projekt, jetzt im Wartungsmodus , empfiehlt die Migration zu Java.time.

Weitere Informationen finden Sie im Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen.

Ein Großteil der Java.time-Funktionalität ist auf Java 6 & 7 in ThreeTen-Backport und weiter auf Android in ThreeTenABP (siehe Verwendung…) ).

Das ThreeTen-Extra -Projekt erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie einige nützliche Klassen, wie zum Beispiel Interval , YearWeek , YearQuarter und more .

4
Basil Bourque

Erstellen Sie eine allgemeine Methode zum Konvertieren von Zeichenfolgen in das Datumsformat

public static void main(String[] args) throws Exception {
    long test = ConvertStringToDate("May 26 10:41:23", "MMM dd hh:mm:ss");
    long test2 = ConvertStringToDate("Tue, Jun 06 2017, 12:30 AM", "EEE, MMM dd yyyy, hh:mm a");
    long test3 = ConvertStringToDate("Jun 13 2003 23:11:52.454 UTC", "MMM dd yyyy HH:mm:ss.SSS zzz");
}

private static long ConvertStringToDate(String dateString, String format) {
    try {
        return new SimpleDateFormat(format).parse(dateString).getTime();
    } catch (ParseException e) {}
    return 0;
}
0
user1960808
  String dateTime="15-3-2019 09:50 AM" //time should be two digit like 08,09,10 
   DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm a");
        LocalDateTime zdt  = LocalDateTime.parse(dateTime,dtf);
        LocalDateTime now = LocalDateTime.now();
        ZoneId zone = ZoneId.of("Asia/Kolkata");
        ZoneOffset zoneOffSet = zone.getRules().getOffset(now);
        long a= zdt.toInstant(zoneOffSet).toEpochMilli();
        Log.d("time","---"+a);

sie können die Zonen-ID aus diesem Link !

0
Flash