2012-08-22 10 views
7

Ich bin nicht daran interessiert, was die aktuelle UTC-Zeit in Millisekunden ist, noch muss ich mich mit Zeitzonen herumschlagen. Mein ursprüngliches Datum ist bereits als UTC-Zeitstempel gespeichert.UTC-Datum in Millisekunden umwandeln

Ich habe ein Datum in einer Datenbank in UTC-Zeit gespeichert, "2012-06-14 05:01:25". Ich interessiere mich nicht für die Datetime, sondern nur für den Datumsteil der It. Also, nach dem Abrufen des Datums in Java, und ohne die Stunden, Minuten und Sekunden - ich bin mit "2012-06-14".

Wie kann ich dies in UTC Millisekunden konvertieren?

Antwort

0

Verwenden Sie das Date-Objekt in Kombination mit SimpleDateFormat.

Es gibt eine Methode namens getTime() in Date, die die Millisekunden für Sie zurückgibt.

Beispiel, das Ihr Problem löst:

Date truc = new SimpleDateFormat("y-m-d").parse("2010-06-14"); 
System.out.println(truc.getTime()); 
10

EDIT: ich hatte das "Ignorieren der Tageszeit" Teil verpasst. Es ist jetzt vorhanden, aber am Ende ...

Der einfachste Ansatz ist wahrscheinlich SimpleDateFormat zu verwenden, entsprechend der Zeitzone eingestellt haben:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); 
format.setTimeZone(TimeZone.getTimeZone("UTC")); 

Date date = format.parse(text); 
long millis = date.getTime(); 

(Einstellung der Zeitzone ist die wichtige Bit hier, wie sonst wird es den Wert interpretiert in der lokalen Zeitzone zu sein.)

Alternativ, wenn Sie etwas weniger trivial als dies tun, verwenden Joda Time, die einen viel besseren Datum/Zeit-API ist. Insbesondere SimpleDateFormatist nicht Thread-sicher während DateTimeFormatter ist:

// This can be reused freely across threads after construction. 
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") 
    .withLocale(Locale.US) 
    .withZoneUTC(); 

// Option 1 
DateTime datetime = formatter.parseDateTime(text); 
long millis = dateTime.getMillis(); 

// Option 2, more direct, but harder to diagnose errors 
long millis = formatter.parseMillis(text); 

nun so weit, haben wir die ganze ganze caboodle analysiert. Der einfachste Weg, um das Datum Teil zu ignorieren, ist es einfach abzurunden - immerhin Java nicht befolgt Schaltsekunden, also können wir es nur gestutzt:

long millisPerDay = 24L * 60L * 60L * 1000L; // Or use TimeUnit 
long dayMillis = (millis/millisPerDay) * millisPerDay; 

Das wird „Runde in Richtung 1970“ so, wenn Sie habe ein Datum vor 1970 wird es rund um die Ende des Tages - aber ich vermute, dass ist unwahrscheinlich, dass ein Problem sein.

Mit der Joda Zeit Version können Sie nur diese statt:

DateTime dateTime = formatter.parseDateTime(text); 
long millis = dateTime.toLocalDate().getLocalMillis(); 

Ich persönlich würde nicht geht mit dem Gedanken, nur einen Teil nehmen. Auch wenn Sie nicht wirklich interessiert sind Erhaltung der die Stunde/Minute/Sekunde, ich denke, es ist angemessen zu analysieren, was Sie gegeben haben und dann wegwerfen Informationen. Abgesehen von allem anderen macht es Ihren Code mit schlechten Daten, z.B.

"2012-06-100" 

oder

"2012-06-14 25:01:25" 

zeigen Probleme in was auch immer Sie Datas liefern, und es ist gut, dass vor Ort anstatt blind fortzusetzen, nur weil die ersten 10 Zeichen in Ordnung sind.

+0

Da nur OP das Datum will, würde ich String (0,10) es zuerst und nur das Datum analysieren. –

+0

@PeterLawrey: Ich habe diesen Teil tatsächlich vermisst! Will edit ... –

+2

@PeterLawrey: Ich habe gegen den Teilstring am Ende des Post argumentiert. –

0
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); //or whatever format you have 
Date t = ft.parse('2014-03-20'); 

String result = String.format("%tQ", t); 

System.out.printf("%tQ", t); 

Es gibt zwei Methoden hier:

  1. Sie die Ergebnis Millisekunden in eine Variable Ergebnis setzen
  2. er den Druck auf Anhieb.
0

Einfachere

Die answer by Jon Skeet ist richtig. Und er macht einen guten Punkt darüber, die Zeit-Informationen während des Parsens einzuschließen, anstatt sie zu kürzen.

Allerdings könnte sein Code vereinfacht werden. Vor allem, weil Joda-Time eine wichtige neue Methode in den neuesten Versionen erhalten: withTimeAtStartOfDay. Diese Methode ersetzt alle "Mitternacht" -bezogenen Klassen und Methoden, die jetzt veraltet sind.

Angeben einer Locale ist eine gute Angewohnheit, wie in seinem Code gezeigt. Aber in diesem speziellen Fall ist ein Gebietsschema nicht notwendig.

Seine Antwort schlägt korrekt die Joda-Time-Bibliothek vor, die der Verwendung von java.util.Date, .Calendar und java.text.SimpleTextFormat weit überlegen ist. Diese Klassen sind notorisch lästig und sollten vermieden werden. Verwenden Sie stattdessen Joda-Time oder das neue java.time package in Java 8 (inspiriert von Joda-Time, definiert durch JSR 310).

erste Moment des Tages

Sie können keine Zeit-of-day ignorieren, wenn was Sie wollen, eine Anzahl von Millisekunden-since- epoch ist. Ich vermute, was Sie wollen, ist die Zeit bis zum ersten Moment des Tages zu ändern. In UTC bedeutet dies immer die Zeit 00:00:00.000. Beachten Sie jedoch, dass in lokalen Zeitzonen der erste Moment aufgrund von Daylight Saving Time und möglicherweise anderen Anomalien eine andere Zeit sein kann.

ISO 8601

Ihr String ist fast in Standard ISO 8601 Format, aber wir brauchen ein T für den Raum in der Mitte zu tauschen. Dann können wir die resultierende Zeichenfolge direkt an Joda-Time übergeben, da Joda-Time standardmäßig formatters für Standard-Strings verwendet.

Beispielcode

Der folgende Beispielcode nimmt die Absicht Ihrer Frage ist es, eine Zeichenfolge als Datum-Zeit-Wert in UTC Zeitzone, stellen Sie die Zeit bis zum ersten Moment des Tages zu analysieren, und dann konvertieren auf die Anzahl der Millisekunden seit Unix epoch (Anfang 1970 in UTC).

String inputRaw = "2012-06-14 05:01:25"; 
String input = inputRaw.replace(" ", "T"); // Replace SPACE with a 'T'. 
DateTime dateTime = new DateTime(input, DateTimeZone.UTC); // Parse, assuming UTC. 
DateTime dateTimeTopOfTheDay = dateTime.withTimeAtStartOfDay(); // Adjust to first moment of the day. 
long millisecondsSinceUnixEpoch = dateTimeTopOfTheDay.getMillis(); // Convert to millis. Use a 'long', not an 'int'. 
-1

Ich benutze einen einfach und geradlinig Ansatz:

Date date = new Date(utcDateInString); 
long utcDateInMilliSeconds = date.getTime(); 
+0

Jemand hat meine Antwort abgelehnt, ohne einen Grund anzugeben. Dies ist in letzter Zeit ein zunehmender Trend bei StackOverflow und sollte vermieden werden. – zeeshan