Pregunta

No puedo entender por qué ocurre lo siguiente:

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?
¿Fue útil?

Solución

¿Qué milisegundos?En el primer ejemplo, solo proporciona información de minutos, mientras que el segundo ejemplo toma la fecha actual del sistema en milisegundos. ¿Qué es lo que está buscando?

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

Otros consejos

De acuerdo con lo anterior, no debería haber milisegundos...

Porque el formato de fecha simple que especificó descarta los milisegundos.Entonces el objeto Fecha resultante no tiene esa información.Entonces, cuando lo imprimes, son todos 0.

Por otro lado, el objeto Fecha conserva los milisegundos cuando le asigna un valor con milisegundos (en este caso, usando la nueva Fecha()).Entonces, cuando los imprimes, también contienen los milisegundos.

En lugar de utilizar las bibliotecas Sun JDK Time/Date (que dejan mucho que desear), recomiendo echar un vistazo a http://joda-time.sourceforge.net.

Este es un proyecto de Sourceforge muy maduro y activo y tiene una API muy elegante.

Cuando analiza una fecha, solo utiliza la información que usted proporciona.En este caso sólo sabe MM-dd-aaaa HH:mm.

La creación de un nuevo objeto de fecha devuelve la fecha/hora actual del sistema (número de milisegundos desde la época).

toString() de un objeto Date no te muestra los milisegundos...pero estan ahi

Entonces new Date() es un objeto con resolución de milisegundos, como puede verse por:

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

Sin embargo, cuando construyes tu fecha con SimpleDateFormat, no se le pasan milisegundos.

¿Me estoy perdiendo la pregunta aquí?

[editar] Jajaja... demasiado lento;)

Date.getTime devuelve el número de milisegundos desde el 1 de enero de 1970 a las 00:00:00 GMT representado por el objeto Fecha.Entonces "04-06-2007 07:05" - "01-01-1970 00:00" es igual a 1180955340000 milisegundos.Dado que la única preocupación de su pregunta es la parte horaria de la fecha, una forma aproximada de pensar en este cálculo es la cantidad de milisegundos entre las 07:05 y las 00:00, que es 25500000.Esto es divisible por 1000 ya que ninguno de los dos tiempos tiene milisegundos.

En la segunda fecha utiliza la hora actual en la que se ejecuta esa línea de código.Eso utilizará los milisegundos actuales después del segundo actual en el cálculo.Por lo tanto, es muy probable que Date.getTime devuelva un número que no sea divisible por 1000.

El getTime() método de Date devuelve el número de milisegundos desde el 1 de enero de 1970 (esta fecha se llama "época" porque todas las fechas de la computadora se basan en esta fecha).Debería no se utilizará para mostrar una versión legible por humanos de su fecha.

Utilizar el SimpleDateFormat.format() método en su lugar.Aquí hay una versión revisada de parte de su código que creo que puede resolver su 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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top