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

641

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.

SimpleTextFormatFuncionará bien. Aquí la unidad de tiempo más baja es la segunda, pero ¿cómo obtengo milisegundos también?

Sunil Kumar Sahoo
fuente
32
Cuando todo lo demás falla, lea la documentación .
Hot Licks
44
Para su información, las clases de fecha y hora viejas problemáticas tales como java.util.Date, java.util.Calendary java.text.SimpleTextFormatahora están legado , suplantados por los java.time clases. Ver Tutorial de Oracle .
Basil Bourque

Respuestas:

1003
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Jay Jay
fuente
Por curiosidad, ¿qué beneficio aporta el uso de SimpleDateFormat solo: dateTime.ToString ("aaaa-MM-dd HH: mm: ss.SSS")?
NickG
10
@NickG ¿Dónde está este toString(String format)método? El java.util.Dateno parece tenerlo. ¿Te refieres a la API de Joda Time? Pero un posible beneficio es la reutilización del mismo objeto formateador. Otra es que no tiene que agregar una API: la clase Date es una clase de biblioteca Java estándar.
ADTC
22
En Java 8 puede usar DateTimeFormatter para el mismo propósito.
Vitalii Fedorenko
77
SimpleDateFormat no es seguro para subprocesos, pero el DateTimeFormatter más reciente es seguro para subprocesos.
devdanke
15
Usando Java 8 datetime API:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha
202

Un Java One Liner

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"));
}
Joram
fuente
99
LocalDateTime y DateTimeFormatter son seguros para subprocesos a diferencia de SimpleDateFormat
Maxple el
@Maxple cualquier caso donde SimpleDateFormat causa problemas?
gaurav
1
@gaurav aquí está tu cookie: callicoder.com/java-simpledateformat-thread-safety-issues
kidnan1991
103

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 API de SimpleDateFormat describe la cadena de formato en detalle.

Michael Borgwardt
fuente
45

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()));
duggu
fuente
31

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 versiones posteriores, tenemos el marco java.time integrado en Java 8 y versiones posteriores. Estas nuevas clases suplantan a las viejas y problemáticas clases java.util.Date/.Calendar. Las nuevas clases están inspiradas en el exitoso marco Joda-Time , pensado 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 resolución en nanosegundos (9 decimales en fracción de segundo), en comparación con la resolución en milisegundos (3 decimales) de java.util.Date y Joda-Time. Entonces, al formatear para mostrar solo 3 decimales, podría estar ocultando datos.

Si desea eliminar cualquier microsegundos o nanosegundos de sus datos, truncar.

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

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

Un Instantrepresenta un momento en la línea de tiempo en UTC con una resolución de hasta nanosegundos . Capturar el momento actual en Java 8 se limita a milisegundos , con una nueva implementación en Java 9 que captura hasta nanosegundos dependiendo de las capacidades del reloj de hardware de su computadora.

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

2016-05-06T23: 24: 25.694Z

Reemplace el Ten el medio con un espacio y el Zsin 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 importa incluir el desplazamiento o la zona horaria, haga una fecha-hora "local" no relacionada con ninguna localidad en particular.

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

Joda-Time

La exitosa biblioteca Joda-Time fue la inspiración para el marco java.time. Se recomienda 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 corres ...

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

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

int millisOfSecond = myDateTime.getMillisOfSecond ();
Albahaca Bourque
fuente
9

Yo usaría algo como esto:

String.format("%tF %<tT.%<tL", dateTime);

La variable dateTimepuede ser cualquier valor de fecha y / o hora, consulte JavaDoc paraFormatter .

Usagi Miyamoto
fuente
9

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 dará lugar 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 visión general al respecto.

Entonces, en Java 8, algo como a continuación 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 se joda-timeestá convirtiendo en obsoleto y pidió a los usuarios que migren a nuevos java.time.

Tenga en cuenta que a partir de Java SE 8 en adelante, se solicita a los usuarios que migren 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 Calendar , puede usarla 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 tenías 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 acaba de tener la época milisegundos,

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());
principal
fuente
nivel mínimo de API es 26
AbhinayMe
4

Para complementar las respuestas anteriores, aquí hay un pequeño ejemplo de trabajo de un programa que imprime la hora y fecha actuales, incluidos los 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);
    }
}

ttb
fuente
2

Use esto para obtener su hora actual en el formato especificado:

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }
Abhishek Sengupta
fuente
Para su información, las antiguas clases de fecha y hora terriblemente problemáticas como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .
Basil Bourque
En realidad, estaba usando esta solución para la aplicación de Android, pero para usar la clase Java.time en Android necesitamos tener la API configurada en al menos 27. De todos modos, gracias por compartir la información.
Abhishek Sengupta
Casi toda la funcionalidad java.time se transfiere a Java 6 y 7 en el proyecto ThreeTen-Backport con prácticamente la misma API. Más adaptado a Android <26 en el proyecto ThreeTenABP . Por lo tanto, no hay ninguna razón para volver a tocar esas horribles clases de fecha y hora.
Basil Bourque
2

Tengo un ejemplo simple aquí para mostrar la fecha y la hora con Millisecond ......

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class MyClass{

    public static void main(String[]args){
        LocalDateTime myObj = LocalDateTime.now();
        DateTimeFormatter myFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS);
        String forDate = myObj.format(myFormat);
        System.out.println("The Date and Time are: " + forDate);
    }
}
Fridjato Parte Fridjat
fuente
Se ve bien, pero ¿agrega información sobre, digamos, el comentario de 5 años de rsinha ?
barba gris
1

Respuesta:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
ZonedDateTime start = Instant.now().atZone(ZoneId.systemDefault());
String startTimestamp = start.format(dateFormatter);
umamaheshwar thati
fuente
0

java.text (anterior a java 8)

public static ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    };
};

...
dateFormat.get().format(new Date());

java.time

public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

...
dateTimeFormatter.format(LocalDateTime.now());
Mykhaylo Adamovych
fuente
-1

Simplemente puede obtenerlo en el formato que desee.

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