Como obter o horário atual no formato AAAA-MM-DD HH: MI: Sec.Millisecond em Java?

641

O código abaixo fornece a hora atual. Mas isso não diz nada sobre milissegundos.

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

Recebo a data no formato 2009-09-22 16:47:08 (AAAA-MM-DD HH: MI: Seg) .

Mas quero recuperar a hora atual no formato 2009-09-22 16:47:08.128((AAAA-MM-DD HH: MI: Sec.Ms) - onde 128 indica o milissegundo.

SimpleTextFormatvai funcionar bem. Aqui, a menor unidade de tempo é a segunda, mas como eu ganho milissegundos também?

Sunil Kumar Sahoo
fonte
32
Quando tudo mais falhar, leia a documentação .
Hot Licks
4
FYI, os incômodos aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleTextFormatestão agora legado , suplantado pelos java.time classes. Consulte o Tutorial da Oracle .
Basil Bourque

Respostas:

1003
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Jay Jay
fonte
Por curiosidade, que benefício o uso de SimpleDateFormat traz apenas: dateTime.ToString ("aaaa-MM-dd HH: mm: ss.SSS")?
NickG
10
@NickG Onde está esse toString(String format)método? O java.util.Dateparece não ter. Você está se referindo à API do Joda Time? Mas um benefício possível é a reutilização do mesmo objeto formatador. Outra é que você não precisa adicionar uma API - a classe Date é uma classe padrão da biblioteca Java.
ADTC
22
No Java 8, você pode usar o DateTimeFormatter para a mesma finalidade.
Vitalii Fedorenko
7
SimpleDateFormat não é seguro para threads, mas o DateTimeFormatter mais recente é seguro para threads.
Devdanke # 25/17
15
Usando a API do datetime do Java 8:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha
202

Um liner Java único

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

no estilo JDK8

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}
Joram
fonte
9
LocalDateTime e DateTimeFormatter são seguros para threads, ao contrário de SimpleDateFormat
Maxple 20/17
@Maxple em qualquer caso em que SimpleDateFormat cause problemas?
21419
1
@gaurav aqui é o seu cookie: callicoder.com/java-simpledateformat-thread-safety-issues
kidnan1991
103

Você só precisa adicionar o campo de milissegundos na sua sequência de formato de data:

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

O documento da API de SimpleDateFormat descreve a cadeia de formato em detalhes.

Michael Borgwardt
fonte
45

tente o seguinte: -

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

ou

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));
duggu
fonte
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

No Java 8 e posterior, temos a estrutura java.time incorporada no Java 8 e posterior. Essas novas classes substituem as antigas classes problemáticas java.util.Date/.Calendar. As novas classes são inspiradas no altamente bem - sucedido framework Joda-Time , pretendido como seu sucessor, similar em conceito, mas re-arquitetado. Definido pelo JSR 310 . Prorrogado pelo projeto ThreeTen-Extra . Veja o tutorial .

Esteja ciente de que java.time é capaz de resolução em nanossegundos (9 casas decimais em fração de segundo) versus milissegundos resolução em (3 casas decimais) de java.util.Date e Joda-Time. Portanto, ao formatar para exibir apenas três casas decimais, você pode ocultar dados.

Se você deseja eliminar microssegundos ou nanossegundos de seus dados, trunque.

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

As classes java.time usam o formato ISO 8601 por padrão ao analisar / gerar cadeias. A Zno final é abreviação deZulu , e significa UTC .

An Instantrepresenta um momento na linha do tempo no UTC com resolução de até nanossegundos . A captura do momento atual no Java 8 é limitada a milissegundos , com uma nova implementação no Java 9 capturando até nanossegundos, dependendo das habilidades do relógio de hardware do computador.

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

2016-05-06T23: 24: 25.694Z

Substitua o Tmeio por um espaço e o Zpor nada, para obter a saída desejada.

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 você não se importa em incluir o deslocamento ou o fuso horário, torne uma data "local" não relacionada a qualquer localidade específica.

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

Joda-Time

A bem-sucedida biblioteca Joda-Time foi a inspiração para o framework java.time. É aconselhável migrar para java.time quando conveniente.

O formato ISO 8601 inclui milissegundos e é o padrão para a biblioteca Joda-Time 2.4.

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

Quando correr ...

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

Além disso, você pode solicitar os milissegundos de fração de segundo como um número, se necessário:

int millisOfSecond = myDateTime.getMillisOfSecond ();
Basil Bourque
fonte
9

Eu usaria algo como isto:

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

Variável dateTimepode ser qualquer valor de data e / ou hora, consulte JavaDoc paraFormatter .

Usagi Miyamoto
fonte
9

A maneira mais fácil era (antes do Java 8) usar,

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

Mas SimpleDateFormat não é seguro para threads. Nem java.util.Date . Isso levará a possíveis problemas de simultaneidade para os usuários. E há muitos problemas nesses projetos existentes. Para superá-los agora no Java 8, temos um pacote separado chamado java.time . Esta Java SE 8 Data e Hora documento de tem uma boa visão geral sobre ele.

Assim, no Java 8, algo como abaixo fará o truque (para formatar a data / hora atual),

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

E uma coisa a notar é que ele foi desenvolvido com a ajuda da popular biblioteca de terceiros joda-time ,

O projeto foi liderado em conjunto pelo autor de Joda-Time (Stephen Colebourne) e Oracle, sob JSR 310, e aparecerá no novo pacote Java SE 8 java.time.

Mas agora o joda-timeestá ficando obsoleto e pediu aos usuários que migrassem para novosjava.time .

Observe que a partir do Java SE 8 em diante, os usuários são solicitados a migrar para o java.time (JSR-310) - uma parte principal do JDK que substitui este projeto

De qualquer forma, tendo dito isso,

Se você tiver uma instância do Google Agenda, use-a abaixo para convertê-la para a nova 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

Se você tivesse um 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

Se você tivesse a época milissegundos,

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());
prime
fonte
o nível mínimo de API é 26
AbhinayMe
4

Para complementar as respostas acima, aqui está um pequeno exemplo de trabalho de um programa que imprime a hora e a data atuais, incluindo milissegundos.

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
fonte
2

Use isso para obter seu horário atual no formato especificado:

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }
Abhishek Sengupta
fonte
FYI, os terrivelmente problemáticas aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleDateFormatestão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque
Na verdade, eu estava usando esta solução para o Android App, mas para usar a classe Java.time no Android, precisamos ter a API definida como pelo menos 27. De qualquer forma, obrigado por compartilhar as informações.
Abhishek Sengupta 16/11
Quase toda a funcionalidade java.time é portada para Java 6 e 7 no projeto ThreeTen-Backport com praticamente a mesma API. Mais adaptado ao Android <26 no projeto ThreeTenABP . Portanto, não há razão para voltar a tocar naquelas aulas horríveis e horríveis de datas.
Basil Bourque
2

Eu tenho um exemplo simples aqui para exibir data e hora com milissegundos ......

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 Part Fridjat
fonte
Parece bom, mas acrescenta informações sobre o comentário de rsinha , de 5 anos ?
greybeard
1

Resp:

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
fonte
0

java.text (anterior ao 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
fonte
-1

Você pode simplesmente obtê-lo no formato desejado.

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