¿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?


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

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

99
LocalDateTime y DateTimeFormatter son seguros para subprocesos a diferencia de SimpleDateFormat
Maxple el

@Maxple cualquier caso donde SimpleDateFormat causa problemas?
gaurav




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


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

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


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

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

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


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

-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()));
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.