Convertando um java.util.Date()

Boas,

Preciso converter um java.util.Date() no formato yyyyMMddHHmmSS.
Exemplo:

public class Test {
   
   private static DateFormat df5 = new SimpleDateFormat("yyyyMMddHHmmSS");
   
   /** Creates a new instance of Test */
   public Test() {
   }
   
   public static void main(String[] args) {
      System.out.println("Data: " + invertAnoMesDiaHora(new Date()));
   }

    public static String invertAnoMesDiaHora(Date str) {
        try {
            return df5.format(str);
        } catch (Exception e) {
            System.out.println("invertAnoMesDiaHora: " + e.getMessage());
        }
        return null;
    }  
}

Resultado printado: “Data: 200607280935437
O problema são os segundos, ele não respeitou a formatação, ficando com três dígitos.

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.

Muito obrigado, eu resolvi mudando apenas de:

private static DateFormat df5 = new SimpleDateFormat(“yyyyMMddHHmmSS”);

para:
private static DateFormat df5 = new SimpleDateFormat(“yyyyMMddHHmmss”);

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:

java.util.Date data=new SimpleDateFormat("dd/MM/yyyy").parse(req.getParameter("inicio"));

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:

d=new Date(); sdf.setLenient(false); out.println("Outro teste\nData:"+d); sdf.applyPattern("dd/MM/yyyy"); aux=sdf.format(d); System.out.println("String:"+aux);

Agora se eu adicionar essas linhas abaixo fica no formato errado:

d=sdf.parse(aux); out.println("Data:"+d);

Estou usando Struts com Hibernate. Qdo. vou alterar algum registro, ele me traz no formato yyyy-MM-dd.

Alguém sabe como posso resolver isso???