2014-10-29 10 views
7

Voglio convertire String myDate = "2014/10/29 18:10:45" in long ms (i.e. currentinmlilies)? Lo cerco su Google, ma posso solo trovare come convertire ms in data.Come convertire una data in millisecondi

Nota: per chiarire, voglio ottenere il ms dalla data nel formato 1970/1/1.

+1

SimpleDateFormat è tuo amico. – user2336315

+0

Come si converte una data in millisecondi, intendi tempo? – brso05

+0

Inoltre dici ms fino ad oggi? – brso05

risposta

27

Non si dispone di un Date, si dispone di una rappresentazione String di una data. È necessario convertire String in Date e quindi ottenere i millisecondi. Per convertire un String in un Date e viceversa, è necessario utilizzare la classe SimpleDateFormat.

Ecco un esempio di ciò che si vuole/bisogno di fare (assumendo fuso orario non è coinvolto qui):

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(); 

Ancora, fate attenzione perché in Java i millisecondi ottenuti sono i millisecondi tra l'epoca desiderata e 1970-01-01 00:00:00.

3

La classe SimpleDateFormat consente di analizzare un String in un oggetto java.util.Date. Una volta ottenuto l'oggetto Date, è possibile ottenere i millisecondi dall'epoca chiamando lo Date.getTime().

L'esempio completo:

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(); 

Si noti che questo ti dà una long e non una doppia, ma penso che probabilmente è quello che intendeva. La documentazione per la classe ha tonnellate di informazioni su come configurarlo per analizzare diversi formati.

1

Time Zone

La risposta accettata è corretta, tranne che ignora la questione cruciale del fuso orario. La tua stringa di inserimento è 6:10 PM a Parigi o Montréal? O UTC?

Utilizzare un proper time zone name. Di solito un continente più città/regione. Ad esempio, "Europe/Oslo". Evita i codici a 3 o 4 lettere che non sono né standardizzati né unici.

Joda Time

Di seguito è riportato lo stesso tipo di codice, ma utilizzando la libreria Joda-Time 2.5 e la gestione del fuso orario.

Le classi java.util.Date, .Calendar e .SimpleDateFormat sono notoriamente problematiche, confuse e imperfette. Evitalo. Utilizzare Joda-Time o il pacchetto java.time (ispirato Joda-Time) incorporato in Java 8.

ISO 8601

La stringa è quasi in formato ISO 8601. Le barre devono essere trattini e lo SPAZIO in mezzo deve essere sostituito con uno T. Se lo modifichiamo, la stringa risultante può essere inserita direttamente nel costruttore senza preoccuparsi di specificare un formattatore. Joda-Time utilizza i formati ISO 8701 in quanto è di default per l'analisi e la generazione di stringhe.

Esempio di codice

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(); 
+0

Quale ID DateTimeZone si trova in Norvegia? È qualcosa su GMT +1, non ne sono sicuro. – HydroTekZ

+0

@HydroTekZ Vedi modifica. –

2

La risposta è 2017: utilizzare le classi di data e ora introdotti in Java 8 (e anche backported a Java 6 e 7 nel ThreeTen Backport).

Se si vuole interpretare la stringa data-ora nel fuso orario del computer:

long millisSinceEpoch = LocalDateTime.parse(myDate, DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm:ss")) 
      .atZone(ZoneId.systemDefault()) 
      .toInstant() 
      .toEpochMilli(); 

Se un altro fuso orario, riempire quella zona nel posto di ZoneId.systemDefault(). Se UTC, utilizzare

long millisSinceEpoch = LocalDateTime.parse(myDate, DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm:ss")) 
      .atOffset(ZoneOffset.UTC) 
      .toInstant() 
      .toEpochMilli(); 
+0

LocalDateTime non è definito –

+0

Grazie per aver segnalato, @YASHDAVE. Devi importare 'LocalDateTime'. Se stai usando Java 8 o successivo, usa 'import java.time.LocalDateTime' ;. Se Java 6 o 7, ottenere il ThreeTen Backport I collegato nella risposta e quindi utilizzare 'import org.threeten.bp.LocalDateTime;'. –

Problemi correlati