Como formatar um timestamp java.sql para exibição?

103

Como faço para formatar um carimbo de data / hora java.sql ao meu gosto? (para uma string, para fins de exibição)

nos
fonte

Respostas:

160

java.sql.Timestampestende java.util.Date. Você pode fazer:

String s = new SimpleDateFormat("MM/dd/yyyy").format(myTimestamp);

Ou para incluir também o tempo:

String s = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(myTimestamp);
ChssPly76
fonte
3
Isso funcionará, mas cuidado, pois SimpleDateFormat não é seguro para threads.
Brian Agnew
17
Apenas um pequeno lembrete de que se o objeto SimpleDateFormat for um objeto com escopo local (ele é criado e usado apenas dentro de um método), então ele é seguro para threads, uma vez que a pilha na qual ele residirá é inerentemente "segura para threads" (uma vez que pertence a um único tópico).
quantum
5
Para incluir o tempo, você precisará usar SimpleDateFormat ("MM / dd / aaaa hh: mm") ou algo semelhante
AverageMarcus
1
para torná-lo completo para quem precisa, String S = new SimpleDateFormat ("MM / dd / aaaa HH: mm: ss"). format (myTimestamp);
Ishan Liyanage
27

Use String.format (ou java.util.Formatter ):

Timestamp timestamp = ...
String.format("%1$TD %1$TT", timestamp)

EDITAR:
consulte a documentação do Formatter para saber o que significa TD e TT: clique em java.util.Formatter

O primeiro 'T' significa:

't', 'T'    date/time   Prefix for date and time conversion characters.

e o caractere seguindo aquele 'T':

'T'     Time formatted for the 24-hour clock as "%tH:%tM:%tS".
'D'     Date formatted as "%tm/%td/%ty". 
user85421
fonte
1
Essa é a melhor resposta, para mim. Nenhum objeto supérfluo é criado apenas para converter o carimbo de data / hora em uma string.
Salil
1
Agora deve estar claro onde encontrar a documentação e o que ela significa
user85421
Muito elegante. Só para ficar claro, a formatação produzida pelo exemplo aqui se parece com 05/30/17 00:39:18.
Noumenon
@Noumenon obrigado, esse era o formato "ao meu gosto", conforme exigia a pergunta [:-)
user85421
10

Para esta questão em particular, a sugestão padrão java.text.SimpleDateFormatfunciona, mas tem o infeliz efeito colateral de SimpleDateFormat não ser thread-safe e pode ser a fonte de problemas particularmente desagradáveis, uma vez que corromperá sua saída em cenários multi-threaded, e você não obtenha quaisquer exceções!

Eu recomendo fortemente olhar para Joda para qualquer coisa assim. Por quê ? É uma biblioteca de data / hora muito mais rica e intuitiva para Java do que a biblioteca atual (e a base da nova biblioteca de data / hora Java padrão em ascensão, então você aprenderá um que logo se tornará padrão API).

Brian Agnew
fonte
8
Bom aviso. Mas muito fácil de resolver - não compartilhe instâncias de SimpleDateFormat armazenando-as no escopo da sessão / variáveis ​​de instância / contexto estático e, em seguida, acessando-as de vários threads. Basta criar um novo SimpleDateFormat () dentro do seu método e descartá-lo após o uso. Isso é threadsafe.
Glen Best de
Claro, se você realmente deseja armazenar / compartilhar a instância SimpleDateFormat, sincronize o acesso: synchronized (simpleDateFormatInstance) {s = simpleDateFormatInstance.format (myTimeStamp)} OU crie uma extensão personalizada da classe SDF e faça isso automaticamente dentro do método de formatação.
Glen Best de
9

Se você estiver usando MySQL e quiser que o próprio banco de dados execute a conversão, use isto:

DATE_FORMAT (data, formato)

Se você preferir formatar usando Java, use isto:

java.text.SimpleDateFormat

SimpleDateFormat dateFormat = new SimpleDateFormat("M/dd/yyyy");
dateFormat.format( new Date() );
DreadPirateShawn
fonte
-9

String timeFrSSHStr = timeFrSSH.toString ();

1909
fonte