Se não me engano, como “S” representa sempre milissegundos, ele sempre será posto com três casas (Se procurar no Bug Database, bugs.sun.com, talvez você ache algo referente a isso.). No seu caso dá para fazer uma ligeira gambiarra que é a de cortar o último dígito, mas você estará sempre truncando (não arredondando) o tempo.
Não tinha visto que você queria segundos (ss), não milissegundos (SSS).
Cuidado com o uso de DateFormat, NumberFormat etc. em servlets e JSPs; é que essas classes não são thread-safe.
Portanto, nesses casos, não é adequado usar como "static", ou mesmo como variáveis de instância da classe (servlet, JSP).
Para que sejam thread-safe, crie-as localmente em alguma de suas rotinas, ou então encapsule-as em um objeto ThreadLocal.
Uma vez eu postei isto para alguém que estava com problemas de DateFormat não ser thread-safe.
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
class TesteSimpleDateFormatThreadSafe implements Runnable {
private static DateFormat staticDf;
static {
staticDf = new SimpleDateFormat ("yyyy-MM-dd");
staticDf.setLenient (false);
}
/** Isto declara uma instância de SimpleDateFormat para cada thread que acessa sua servlet */
ThreadLocal tl = new ThreadLocal() {
protected synchronized Object initialValue() {
DateFormat df = new SimpleDateFormat ("yyyy-MM-dd");
df.setLenient (false);
return df;
};
};
/** Isto mostra como obter a variável "threadLocal" */
public void efetuaTeste() {
DateFormat df = (DateFormat) tl.get();
System.out.println (df.format (new Date()));
}
/** Para o teste de threads */
public void run() {
while (true) {
// DateFormat df = (DateFormat) tl.get(); // --> método correto
DateFormat df = staticDf; // --> método incorreto
String s = df.format (new Date());
if (!s.equals ("2006-07-28")) {
System.out.println ("Erro! " + s);
break;
}
}
}
/**
* O teste a seguir reproduz o seu erro se você descomentar
* a linha escrita "método incorreto" e não dá erro se você
* descomentar a linha escrita "método correto" acima.
*/
public static void main(String[] args) {
TesteSimpleDateFormatThreadSafe teste = new TesteSimpleDateFormatThreadSafe();
for (int i = 0; i < 10; ++i) {
new Thread (teste).start();
}
}
}
Eh, ás vezes eu não entendo essa formatação de datas…Podiam ter dado uma maior atenção no Mustang…
Por exemplo: gravando uma data no Prevayler usando SimpleDateFormat, teoricamente isso deveria funcionar:
Mas isso zoneia a data que eu entrei e deixa ela assim: Fri Mar 12 00:00:00 BRT 2004
Quando deveria mostrar 12/03/2004!!!
Vou gravar como String e usar o tradicional:
SimpleDateFormat formatoData = new SimpleDateFormat(“dd/MM/yyyy”);
Date data = new Date();
formatoData.format(data);
Aí funciona OK…
Deveria ser mais intuitivo…
Aproveitando o tópico sobre formatação de datas, estou com um pequeno problema usando o Hibernate.
Eu pego minha data no banco que está no formato (yyyy-MM-dd) e gostaria que fosse mostrado no formato dd/MM/yyyy.
Usando o SimpleDateFormat funciona, só que qdo. formata para String, tipo isso: