Convertando um java.util.Date()

5 respostas
R

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.

5 Respostas

T

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.

R

Muito obrigado, eu resolvi mudando apenas de:

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

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

T

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();
        }
    }
}
I

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

 funciona OK

Deveria ser mais intuitivo
N

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???

Criado 28 de julho de 2006
Ultima resposta 2 de ago. de 2006
Respostas 5
Participantes 4