Como obter o timestamp atual no formato de string em Java? "Aaaa.MM.dd.HH.mm.ss"

174

Como obter o registro de data e hora no formato string em Java? "aaaa.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

É isso que eu tenho, mas Timestamp () requer parâmetros ...

user3388884
fonte
preparadoStatement.setTimestamp (1, novo Timestamp (System.currentTimeMillis ()));
Rajat
que erro você está tendo?
Robert Columbia
Para sua informação, as classes antigas de data e hora terrivelmente problemáticas, como SimpleDateFormate java.sql.Timestampagora são herdadas , substituídas pelas classes java.time integradas no Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque

Respostas:

202

Substituir

new Timestamp();

com

new java.util.Date()

porque não há construtor padrão para Timestamp, ou você pode fazê-lo com o método:

new Timestamp(System.currentTimeMillis());
Jigar Joshi
fonte
5
Para sua informação, as classes antigas de data e hora terrivelmente problemáticas, como java.util.Datee java.sql.Timestampagora são herdadas , substituídas pelas classes java.time integradas no Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque
160

Use a java.util.Dateclasse em vez do carimbo de data e hora.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

Isso fornecerá a data atual no formato especificado.

dimoniy
fonte
5
Isso me ajudou e eu fiz alguns mudou então eu não tenho que importação new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni
Melhor new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon
36

tl; dr

Use apenas classes java.time modernas . Nunca use os terríveis aulas legados, como SimpleDateFormat, Date, ou java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

Ou use o fuso horário padrão atual da JVM .

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time e JDBC 4.2

A abordagem moderna usa o java.time classes , como visto acima.

Se o seu driver JDBC estiver em conformidade com o JDBC 4.2 , você poderá trocar diretamente objetos java.time com o banco de dados. Use PreparedStatement::setObjecteResultSet::getObject .

Use java.sql apenas para drivers anteriores ao JDBC 4.2

Se o driver JDBC ainda não estiver em conformidade com o JDBC 4.2 para suporte ao java.time tipos , você deverá voltar a usar as classes java.sql.

Armazenando dados.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

Recuperando dados.

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

Os tipos java.sql, como java.sql.Timestamp, devem ser usados ​​apenas para transferir dentro e fora do banco de dados. Converta imediatamente para tipos java.time no Java 8 e posterior.

java.time.Instant

Um java.sql.Timestampmapeia para a java.time.Instant, um momento na linha do tempo no UTC. Observe o novo método de conversão toInstantadicionado à classe antiga.

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

Fuso horário

Aplique o fuso horário desejado / esperado ( ZoneId) para obter a ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Strings formatadas

Use a DateTimeFormatterpara gerar sua string. Os códigos de padrão são semelhantes aos de, java.text.SimpleDateFormatmas não exatamente, portanto, leia o documento com atenção.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Esse formato específico é ambíguo quanto ao seu significado exato, pois não possui nenhuma indicação de deslocamento do UTC ou fuso horário.

ISO 8601

Se você tem alguma opinião sobre o assunto, sugiro que você considere usar os formatos padrão ISO 8601 em vez de criar seus próprios. O formato padrão é bastante semelhante ao seu. Por exemplo:
2016-02-20T03:26:32+05:30.

As classes java.time usam esses formatos padrão por padrão, portanto, não é necessário especificar um padrão. A ZonedDateTimeclasse estende o formato padrão acrescentando o nome do fuso horário (uma melhoria sábia).

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

Converta em java.sql

Você pode converter de java.time de volta para java.sql.Timestamp. Extraia um InstantdoZonedDateTime .

Novos métodos foram adicionados às classes antigas para facilitar a conversão de / para as classes java.time.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Tabela de tipos de data e hora em Java (herdado e moderno) e no SQL padrão


Sobre java.time

A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date, Calendar, eSimpleDateFormat .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para o java.time classes .

Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade dejava.sql.* classes.

Onde obter as classes java.time?

O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval, YearWeek, YearQuarter, e mais .

Basil Bourque
fonte
Então, qual é o caminho certo para obter o carimbo de data / hora atual do relógio de parede no formato "aaaa.MM.dd.HH.mm.ss"? Sem especificar explicitamente a sequência codificada do meu fuso horário local? Isso é o que arranque tópico estava pedindo, e eu não poderia encontrá-lo em sua resposta ...
t7ko
@ t7ko Adicionei uma linha de código de exemplo à seção tl; dr , mostrando como solicitar explicitamente o fuso horário padrão atual da JVM. Chamar `now () 'sem argumentos faz o mesmo, mas não está claro se você pretendia usar o padrão ou se era ignorante ou esquecido da questão crucial do fuso horário.
Basil Bourque
32

Você pode usar o java.util.Date em vez do carimbo de data / hora:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
Kakarot
fonte
6

Uma abordagem mais apropriada é especificar uma região Locale como um parâmetro no construtor. O exemplo abaixo usa uma região de localidade dos EUA. A formatação da data é sensível ao código de idioma e usa o Código de Idioma para personalizar informações relativas aos costumes e convenções da Região do usuário. Código de Idioma (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());
user3144836
fonte
1
Não existe algo como "Zona de Localização". Suspeito que você esteja confuso Localee com um fuso horário não relacionado. Localecontrola as normas culturais para formatação e a linguagem humana usada para o nome do mês / dia. O fuso horário ajusta a representação de data e hora para ser apropriada para o relógio de parede de uma região . No caso desta questão, o Locale é irrelevante, pois não há problemas de formatação com os quais aplicar normas culturais, nem nomes de mês / dia para localizar em qualquer idioma humano específico.
Basil Bourque
@BasilBourque Obrigado pela sua contribuição. Atualizei a resposta para ser mais explícita.
user3144836 23/02
4

Você pode usar o seguinte

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

Espero que isso ajude. Apenas a minha sugestão e não para pontos de recompensa.

Fénix
fonte
Ele não tem o formato de string solicitado. Também estou com medo que a única coisa que acrescenta um par de respostas semelhantes, é uma complicação desnecessária ...
Ole VV
4

Use java.timeclasses modernas se você usa java 8 ou mais recente.

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

A resposta de Basil Bourque é muito boa. Mas é muito longo. Muitas pessoas não teriam paciência para lê-lo. As 3 principais respostas são muito antigas e podem enganar a nova abelha do Java. Portanto, forneço esta resposta curta e moderna para os novos desenvolvedores que estão por vir. Espero que esta resposta possa reduzir o uso de coisas terríveis SimpleDateFormat.

gzc
fonte