Cómo obtener la hora actual en formato YYYY-MM-DD HH: MI: Sec.Millisecond en Java?

El siguiente código me da la hora actual. Pero no dice nada sobre milisegundos.

public static String getCurrentTimeStamp() { SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//dd/MM/yyyy Date now = new Date(); String strDate = sdfDate.format(now); return strDate; } 

Obtengo la fecha en el formato 2009-09-22 16:47:08 (AAAA-MM-DD HH: MI: Sec) .

Pero quiero recuperar la hora actual en el formato 2009-09-22 16:47:08.128 ((AAAA-MM-DD HH: MI: Sec.Ms) – donde 128 indica el milisegundo.

SimpleTextFormat funcionará bien. Aquí la unidad de tiempo más baja es la segunda, pero ¿cómo puedo obtener un milisegundo también?

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

Un trazador de líneas de Java

 public String getCurrentTimeStamp() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()); } 

en estilo JDK8

 public String getCurrentLocalDateTimeStamp() { return LocalDateTime.now() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); } 

Solo tiene que agregar el campo de milisegundos en su cadena de formato de fecha:

 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

El documento de API de SimpleDateFormat describe la cadena de formato en detalle.

prueba esto:-

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); Date date = new Date(); System.out.println(dateFormat.format(date)); 

o

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar cal = Calendar.getInstance(); System.out.println(dateFormat.format(cal.getTime())); 

tl; dr

 Instant.now() .toString() 

2016-05-06T23: 24: 25.694Z

 ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ).format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) .replace( "T" , " " ) 

2016-05-06 19: 24: 25.694

java.time

En Java 8 y posterior, tenemos el marco java.time integrado en Java 8 y posterior. Estas nuevas clases suplantan a las viejas y problemáticas clases java.util.Date/.Calendar. Las nuevas clases están inspiradas en el exitoso framework Joda-Time , diseñado como su sucesor, similar en concepto pero rediseñado. Definido por JSR 310 . Ampliado por el proyecto ThreeTen-Extra . Ver el tutorial .

Tenga en cuenta que java.time es capaz de una resolución de nanosegundos (9 decimales en fracción de segundo), frente a la resolución de milisegundos (3 lugares decimales) de java.util.Date y Joda-Time. Por lo tanto, al formatear para mostrar solo 3 decimales, podría estar ocultando datos.

Si desea eliminar cualquier microsegundo o nanosegundo de sus datos, trunque.

 Instant instant2 = instant.truncatedTo( ChronoUnit.MILLIS ) ; 

Las clases java.time usan el formato ISO 8601 de forma predeterminada al analizar / generar cadenas. Una Z al final es la abreviatura de Zulu , y significa UTC .

Un Instant representa un momento en la línea de tiempo en UTC con una resolución de hasta nanosegundos . La captura del momento actual en Java 8 está limitada a milisegundos , con una nueva implementación en Java 9 que captura hasta nanosegundos dependiendo de las capacidades de reloj del hardware de su computadora.

 Instant instant = Instant.now (); // Current date-time in UTC. String output = instant.toString (); 

2016-05-06T23: 24: 25.694Z

Reemplace la T en el medio con un espacio, y la Z con nada, para obtener la salida deseada.

 String output = instant.toString ().replace ( "T" , " " ).replace( "Z" , "" ; // Replace 'T', delete 'Z'. I recommend leaving the `Z` or any other such [offset-from-UTC][7] or [time zone][7] indicator to make the meaning clear, but your choice of course. 

2016-05-06 23: 24: 25.694

Como no le interesa incluir el desplazamiento o la zona horaria, establezca una fecha “local” que no esté relacionada con ninguna localidad en particular.

 String output = LocalDateTime.now ( ).toString ().replace ( "T", " " ); 

Joda-Time

La exitosa librería Joda-Time fue la inspiración para el framework java.time. Aconsejable para migrar a java.time cuando sea conveniente.

El formato ISO 8601 incluye milisegundos, y es el predeterminado para la biblioteca Joda-Time 2.4.

 System.out.println( "Now: " + new DateTime ( DateTimeZone.UTC ) ); 

Cuando se ejecuta …

 Now: 2013-11-26T20:25:12.014Z 

Además, puede solicitar la fracción de segundo de milisegundos como número, si es necesario:

 int millisOfSecond = myDateTime.getMillisOfSecond (); 

Para complementar las respuestas anteriores, aquí hay un pequeño ejemplo de trabajo de un progtwig que imprime la hora y la fecha actual, incluidos milisegundos.

 import java.text.SimpleDateFormat; import java.util.Date; public class test { public static void main(String argv[]){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date now = new Date(); String strDate = sdf.format(now); System.out.println(strDate); } } 

Yo usaría algo como esto:

 String.format("%tF % 

Variable dateTime podría ser cualquier fecha y / o valor de tiempo, vea JavaDoc for Formatter .

La forma más fácil era usar (antes de Java 8),

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

Pero SimpleDateFormat no es seguro para subprocesos. Ni java.util.Date . Esto conducirá a posibles problemas de concurrencia para los usuarios. Y hay muchos problemas en esos diseños existentes. Para superar esto ahora en Java 8 tenemos un paquete separado llamado java.time . Este documento de fecha y hora de Java SE 8 tiene una buena descripción al respecto.

Entonces, en Java 8, algo como lo siguiente hará el truco (para formatear la fecha / hora actual),

 LocalDateTime.now() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); 

Y una cosa a tener en cuenta es que fue desarrollado con la ayuda de la popular biblioteca de terceros joda-time ,

El proyecto ha sido dirigido conjuntamente por el autor de Joda-Time (Stephen Colebourne) y Oracle, bajo JSR 310, y aparecerá en el nuevo paquete Java SE 8 java.time.

Pero ahora el joda-time está desaprobando y les pidió a los usuarios que migren a la nueva java.time .

Tenga en cuenta que desde Java SE 8 en adelante, los usuarios deben migrar a java.time (JSR-310), una parte central del JDK que reemplaza este proyecto.

De todos modos, habiendo dicho eso,

Si tiene una instancia de Calendario , puede usar a continuación para convertirla a la nueva java.time ,

  Calendar calendar = Calendar.getInstance(); long longValue = calendar.getTimeInMillis(); LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault()); String formattedString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); System.out.println(date.toString()); // 2018-03-06T15:56:53.634 System.out.println(formattedString); // 2018-03-06 15:56:53.634 

Si tuviera un objeto Date,

  Date date = new Date(); long longValue2 = date.getTime(); LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue2), ZoneId.systemDefault()); String formattedString = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); System.out.println(dateTime.toString()); // 2018-03-06T15:59:30.278 System.out.println(formattedString); // 2018-03-06 15:59:30.278 

Si acabas de tener los milisegundos de época,

 LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault()); 

Simplemente puede obtenerlo en el formato que desee.

 String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date())); 

El documento en Java 8 lo nombra fracciones de segundo , mientras que en Java 6 fue nombrado milisegundo . Esto me llevó a la confusión