String ou Date?

Saudações,

Qual a melhor maneira de se manter objetos transientes* que representam data?

Levanto esta dúvida pelos problemas que já tive ao manipular o date em alguns períodos específicos do horário de verão e configurações de ajuste automático do relógio em máquinas rodando o Windows.

    • Chamo de "transientes" objetos que irão fazer "viagens". Isto é, aqueles que serão enviados para outros computadores via WebService, que serão persistidos editados e recuperados, que sofrerão acesso via rede… etc.

Em busca desta discussão pela inrternet encontrei um post no javafree.org que fala o seguinte:

[quote]Caros amigos,

Procurei no fórum questões relacionadas ao armazenamento de data com hibernate e java. Algumas pessoas sugerem não utilizar a classe java.util.Date, visto que ela tem algumas particularidades, como por exemplo, o mês começar com 0 e o ano iniciar de 1900.

Vi também que algumas pessoas sugeriram utilizar a classe Calendar, porém tentei usar e vi que alguns dos seus métodos estão como "deprecated".

Então, depois de perder algumas centenas de fios de cabelo, testei o armazenamento de datas utilizando String.

Exemplo:

Para o cadastro de clientes, armazenando id, nome e data_nascimento:

  1. na tabela clientes, alterei o tipo de data_nascimento para caractere variante (10)
  2. criei uma classe chamada Data, que já formata no estilo "dd/mm/yyyy" para visualização dos usuários e também no formato "yyyy-mm-dd" para o armazenamento no banco; a classe também recebeu dois métodos, para fazer a leitura das datas nos dois formatos.
  3. na classe Cliente, o atributo dataNascimento foi modificado para String. Ela ganhou dois métodos, um para transformar a dataNascimento do tipo String para Data e outro para transformar a Data para String.

Bom, no mapeamento, como é de se esperar, coloquei também data_nascimento como String.

E… funcionou.

Agora, eis minha dúvida:
Qual a vantagem de utilizar o tipo Data no banco e na aplicação, visto que consigo fazer comparações com a data no formato:
2007-11-08 < 2007-11-10
como também consigo pegar os aniversariantes do mês de novembro:
select * from clientes where data_nascimento like ‘%-11-%’.
[/quote]
fonte: http://www.javafree.org/javabb/viewtopic.jbb?t=865748

E então? O que vocês acham?

Opa :!:

http://www.guj.com.br/posts/list/88150.java

http://www.guj.com.br/posts/list/40082.java

Datas possuem duas propriedades:

-O valor armazenado
-O valor interpretado

O valor armazenado é sempre o mesmo, geralmente é a contagem de milissegundos desde 01/01/1970 00:00:00.000 UTC, também chamado de Epoch.

Deste valor, aplicando o seu fuso horário e outras variações, temos o valor interpretado, que é visualizado pelo usuário.

Sobre mandar os objetos pela rede, existe a interface Serializable, é só implementá-la corretamente.

Sobre a manipulação dos dados, e trocentas outras coisas existem bibliotecas como o JodaTime. Em vez de usar datas do Java, use as datas do Joda.