segunda-feira, 26 de fevereiro de 2007

ColdFusion e as datas

Você faz uma consulta ao banco de dados para alimentar um formulário de fornecedores. Inclui uma variável hidden para guardar a data atual (afinal, ela será o controle de fornecedores). Formata a data para dd/mm/yyyy… E depois descobre que o ColdFusion processa como mm/dd/yyyy. Já arrancou seus cabelos? Chingou, pesquisou, chorou, e nada adiantou? Então vamos à solução.

É comum para quem está começando na programação em CFML tratar objetos data como objetos número (ou seja, criando um sem aspas). O que é importante, nesse caso, não é só atribuir à variável o valor de data, mas sim dizer implicitamente que ela é uma data. Para isto, você pode usar o seguinte código:

1. <cfparam name="”data”" default="#now()#">
2. <cfset data="#LSDateFormat(data,”dd/mm/yyyy”)#">
3. <cfset dia =" listGetAt(data,1,”/”)">
4. <cfset mes =" listGetAt(data,2,”/”)">
5. <cfset ano =" listGetAt(data,3,”/”)">
6. <cfset data =" createdatetime(ano,mes,dia,0,0,0)">

O que esse código faz? Bem, a linha 1 inicializa a variável “data” - caso não exista - com o valor da data de hoje (retornado pela função now() ). A linha 2 transforma essa data para o formato dia/mês/ano. As linhas 3, 4 e 5 partem cada valor da data em uma variável, ficando assim o dia na variável dia, mês na variável mes e ano na variável ano (me senti meio idiota detalhando isso :p).

E finalmente, a linha 6 junta tudo de novo, só que em um objeto data, que você pode usar onde precisar.

Até mesmo no <input type=”Hidden” name=”data” value=#data#>

Pronto, adeus problemas com funções de controle de data (como a famigerada DateAdd() ).

Espero que isso seja útil para você, assim como foi para mim!

Abraços.

Um comentário:

Anônimo disse...

Por que assim cfset data =" createdatetime(ano,mes,dia,0,0,0)"

e não assim:

cfset data =" createdatetime(dia,mes,ano,0,0,0)"

O dia/mes/ano ao invés de ano/mes/dia