Domanda

Non riesco a capire perché si verifica quanto segue:

String date = "06-04-2007 07:05";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm");
Date myDate = fmt.parse(date); 

System.out.println(myDate);  //Mon Jun 04 07:05:00 EDT 2007
long timestamp = myDate.getTime();
System.out.println(timestamp); //1180955100000 -- where are the milliseconds?

// on the other hand...

myDate = new Date();
System.out.println(myDate);  //Tue Sep 16 13:02:44 EDT 2008
timestamp = myDate.getTime();
System.out.println(timestamp); //1221584564703 -- why, oh, why?
È stato utile?

Soluzione

Quali millisecondi?Nel primo esempio stai fornendo solo informazioni sui minuti, mentre il secondo esempio acquisisce la data corrente dal sistema in millisecondi, cosa stai cercando?

String date = "06-04-2007 07:05:00.999";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss.S");
Date myDate = fmt.parse(date);

System.out.println(myDate); 
long timestamp = myDate.getTime();
System.out.println(timestamp);

Altri suggerimenti

d'accordo con sopra, non dovrebbero esserci millisecondi...

Poiché il formato data semplice specificato elimina i millisecondi.Quindi l'oggetto Date risultante non ha queste informazioni.Quindi quando lo stampi, sono tutti 0.

D'altra parte, l'oggetto Date conserva i millisecondi quando gli assegni un valore con millisecondi (in questo caso, utilizzando new Date()).Quindi quando li stampi, contengono anche i millisecondi.

Invece di utilizzare le librerie Sun JDK Time/Date (che lasciano molto a desiderare) consiglio di dare un'occhiata a http://joda-time.sourceforge.net.

Questo è un progetto sourceforge molto maturo e attivo e ha un'API molto elegante.

Quando analizzi una data, vengono utilizzate solo le informazioni fornite.In questo caso conosce solo MM-gg-aaaa HH:mm.

La creazione di un nuovo oggetto data restituisce la data/ora del sistema corrente (numero di millisecondi dall'epoca).

toString() di un oggetto Date non mostra i millisecondi...Ma sono lì

Quindi new Date() è un oggetto con risoluzione in millisecondi, come si può vedere da:

  System.out.printf( "ms = %d\n", myDate.getTime() % 1000 ) ;

Tuttavia, quando crei la tua data con SimpleDateFormat, non gli vengono passati millisecondi

Mi sto perdendo la domanda qui?

[modifica] Hahaha...troppo lento ;)

Date.getTime restituisce il numero di millisecondi dal 1 gennaio 1970, 00:00:00 GMT rappresentato dall'oggetto Date.Quindi "06-04-2007 07:05" - "01-01-1970 00:00" è uguale a 1180955340000 millisecondi.Poiché l'unica preoccupazione della tua domanda riguarda la parte temporale della data, un modo approssimativo di pensare a questo calcolo è il numero di millisecondi tra 07:05 e 00:00 che è 25500000.Questo è equamente divisibile per 1000 poiché nessuno dei due tempi ha millisecondi.

Nella seconda data utilizza l'ora corrente in cui viene eseguita quella riga di codice.Ciò utilizzerà qualunque millisecondo corrente oltre il secondo corrente sia nel calcolo.Pertanto, Date.getTime restituirà molto probabilmente un numero che non è equamente divisibile per 1000.

IL getTime() metodo di Date restituisce il numero di millisecondi dal 1 gennaio 1970 (questa data è chiamata "epoca" perché tutte le date dei computer si basano su questa data).Dovrebbe non essere utilizzato per visualizzare una versione leggibile della tua data.

Usa il SimpleDateFormat.format() metodo invece.Ecco una versione rivista di parte del tuo codice che penso possa risolvere il tuo problema:

String date = "06-04-2007 07:05:23:123";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss:S");
Date myDate = fmt.parse(date); 

System.out.println(myDate);  //Mon Jun 04 07:05:23 EDT 2007
String formattedDate = fmt.format(myDate);
System.out.println(formattedDate); //06-04-2007 07:05:23:123
import java.util.*;

public class Time {
    public static void main(String[] args) {
        Long l = 0L;
        Calendar c = Calendar.getInstance();
        //milli sec part of current time
        l = c.getTimeInMillis() % 1000;  
        //current time without millisec
        StringBuffer sb = new StringBuffer(c.getTime().toString());
        //millisec in string
        String s = ":" + l.toString();
        //insert at right place
        sb.insert(19, s);
        //ENJOY
        System.out.println(sb);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top