Ich möchte String myDate = "2014/10/29 18:10:45"
in
Long ms (d.h. currentinmlilies)`? Ich suche danach auf Google, aber ich kann nur finden, wie man ms in date konvertiert.
Anmerkung: Um es klar zu machen, ich möchte die ms aus dem Datum im Format 1970/1/1 erhalten.
Sie haben kein "Datum", sondern eine "String"-Darstellung eines Datums. Sie sollten die Zeichenkette in ein Datum umwandeln und dann die Millisekunden ermitteln. Um eine Zeichenkette in ein Datum zu konvertieren und umgekehrt, sollten Sie die Klasse SimpleDateFormat verwenden.
Hier ist ein Beispiel für das, was Sie tun wollen/müssen (unter der Annahme, dass die Zeitzone hier keine Rolle spielt):
String myDate = "2014/10/29 18:10:45";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = sdf.parse(myDate);
long millis = date.getTime();
Seien Sie dennoch vorsichtig, denn in Java sind die erhaltenen Millisekunden die Millisekunden zwischen der gewünschten Epoche und 1970-01-01 00:00:00.
Verwendung der neuen Date/Time API, die seit Java 8 verfügbar ist:
String myDate = "2014/10/29 18:10:45";
LocalDateTime localDateTime = LocalDateTime.parse(myDate,
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss") );
/*
With this new Date/Time API, when using a date, you need to
specify the Zone where the date/time will be used. For your case,
seems that you want/need to use the default zone of your system.
Check which zone you need to use for specific behaviour e.g.
CET or America/Lima
*/
long millis = localDateTime
.atZone(ZoneId.systemDefault())
.toInstant().toEpochMilli();
LocalDateTime.parse( // Parse into an object representing a date with a time-of-day but without time zone and without offset-from-UTC.
"2014/10/29 18:10:45" // Convert input string to comply with standard ISO 8601 format.
.replace( " " , "T" ) // Replace SPACE in the middle with a `T`.
.replace( "/" , "-" ) // Replace SLASH in the middle with a `-`.
)
.atZone( // Apply a time zone to provide the context needed to determine an actual moment.
ZoneId.of( "Europe/Oslo" ) // Specify the time zone you are certain was intended for that input.
) // Returns a `ZonedDateTime` object.
.toInstant() // Adjust into UTC.
.toEpochMilli() // Get the number of milliseconds since first moment of 1970 in UTC, 1970-01-01T00:00Z.
1414602645000
Zeitzone
Die akzeptierte Antwort ist korrekt, außer dass sie die entscheidende Frage der Zeitzone ignoriert. Ist Ihr Eingabe-String 6:10 PM in Paris oder Montréal? Oder UTC? Verwenden Sie einen richtigen Zeitzonennamen. Normalerweise ein Kontinent plus Stadt/Region. Zum Beispiel: "Europa/Oslo". Vermeiden Sie die Codes mit 3 oder 4 Buchstaben, die weder standardisiert noch eindeutig sind.
java.time
Der moderne Ansatz verwendet die java.time-Klassen. Ändern Sie Ihre Eingabe so, dass sie dem ISO 8601 Standard entspricht. Ersetzen Sie das SPACE in der Mitte durch ein
T
. Und ersetzen Sie die Schrägstrichzeichen durch Bindestriche. Die java.time-Klassen verwenden diese Standardformate standardmäßig beim Parsen/Generieren von Zeichenketten. Es ist also nicht nötig, ein Formatierungsmuster anzugeben.
String input = "2014/10/29 18:10:45".replace( " " , "T" ).replace( "/" , "-" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;
Eine LocalDateTime
, wie Ihr Eingabestring, hat kein Konzept von Zeitzone oder Offset-von-UTC. Ohne den Kontext einer Zone/eines Offsets hat eine LocalDateTime
keine wirkliche Bedeutung. Ist es 6:10 PM in Indien, Europa oder Kanada? An jedem dieser Orte ist es zu unterschiedlichen Zeitpunkten 6:10 PM, an unterschiedlichen Punkten auf der Zeitachse. Sie müssen also angeben, welchen Ort Sie im Sinn haben, wenn Sie einen bestimmten Punkt auf der Zeitachse bestimmen wollen.
ZoneId z = ZoneId.of( "Europe/Oslo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
Jetzt haben wir einen bestimmten Zeitpunkt, in dieser ZonedDateTime
. Konvertieren Sie in UTC, indem Sie eine Instant
extrahieren. Die Klasse Instant
repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Stellen eines Dezimalbruchs).
Instant instant = zdt.toInstant() ;
Jetzt können wir die gewünschte Anzahl von Millisekunden seit der Epochenreferenz des ersten Moments von 1970 in UTC, 1970-01-01T00:00Z, erhalten.
long millisSinceEpoch = instant.toEpochMilli() ;
Instant
kann Mikrosekunden oder Nanosekunden, feiner als Millisekunden, übertragen. Dieser feinere Bruchteil einer Sekunde wird bei der Zählung von Millisekunden ignoriert.Das java.time Framework ist in Java 8 und höher eingebaut. Diese Klassen ersetzen die lästigen alten legacy Datum-Zeit-Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Time Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration auf die java.time Klassen.
Weitere Informationen finden Sie im Oracle Tutorial. Und suchen Sie bei Stack Overflow nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310.
Sie können java.time-Objekte direkt mit Ihrer Datenbank austauschen. Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist. Sie brauchen keine Strings und keine java.sql.*
-Klassen.
Wo erhält man die java.time-Klassen?
Interval
, YearWeek
, YearQuarter
, und more.Aktualisierung: Das Joda-Time Projekt befindet sich jetzt im Wartungsmodus, und das Team rät zur Migration auf die java.time Klassen. Ich werde diesen Abschnitt aus historischen Gründen beibehalten. Nachfolgend sehen Sie die gleiche Art von Code, aber unter Verwendung der Joda-Time 2.5 Bibliothek und der Handhabung der Zeitzone. Die Klassen java.util.Date, .Calendar und .SimpleDateFormat sind bekanntermaßen mühsam, verwirrend und fehlerhaft. Vermeiden Sie sie. Verwenden Sie entweder Joda-Time oder das java.time-Paket (inspiriert von Joda-Time), das in Java 8 integriert ist.
Ihre Zeichenkette ist fast im ISO 8601-Format. Die Schrägstriche müssen zu Bindestrichen werden und das SPACE in der Mitte sollte durch ein "T" ersetzt werden. Wenn wir das ändern, kann die resultierende Zeichenkette direkt in den Konstruktor eingegeben werden, ohne einen Formatierer angeben zu müssen. Joda-Time verwendet ISO 8701 Formate als Standard für das Parsen und Generieren von Zeichenketten.
String inputRaw = "2014/10/29 18:10:45";
String input = inputRaw.replace( "/", "-" ).replace( " ", "T" );
DateTimeZone zone = DateTimeZone.forID( "Europe/Oslo" ); // Or DateTimeZone.UTC
DateTime dateTime = new DateTime( input, zone );
long millisecondsSinceUnixEpoch = dateTime.getMillis();
Die Klasse SimpleDateFormat ermöglicht das Parsen eines String
in ein java.util.Date
-Objekt. Sobald Sie das Date-Objekt haben, können Sie die Millisekunden seit der Epoche erhalten, indem Sie Date.getTime()
aufrufen.
Das vollständige Beispiel:
String myDate = "2014/10/29 18:10:45";
//creates a formatter that parses the date in the given format
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = sdf.parse(myDate);
long timeInMillis = date.getTime();
Beachten Sie, dass Sie damit ein "long" und kein "double" erhalten, aber ich denke, das ist wahrscheinlich das, was Sie beabsichtigt haben. Die Dokumentation für die Klasse SimpleDateFormat
hat tonnenweise Informationen darüber, wie man sie so einrichtet, dass sie verschiedene Formate parsen kann.