Olá pessoal,

Bom eu já li muita coisa na internet sobre problema de serialização de
data e horário de verão inclusive um post do Maior Junior aqui na
lista.
Eu já estava bem preparado para isso mas fui usar um DateChooser e vi
que esse lance de data no Flash Player é uma droga total!
Bom, meu background é de muito tempo trabalhando com bibliotecas
ajax/html/javascript que têm estes tipo de componente de data e um
erro que quase todas as bibliotecas cometem é que quando se têm um
componente que seleciona apenas a data, ignorando a hora, e o objeto
resultante deste seleção é um Date, a biblioteca considera as horas
minutos segundos e milisegundos da data como 0. O problema que ao
fazer isso e tentar selecionar a data que acontece o nosso amado
horário de verão, as bibliotecas javascript fazem um new Date usando a
data selecionada pelo usuário, peguemos como exemplo deste ano
18/10/2009, e consideram nela 0 para todas as outras propriedades
(hora, min, seg e ms). Se o windows estiver marcado para ajustar o
horário de verão o resultado desta operação será 17/10/2009 23:00:00.
A grande maioria destas bibliotecas percebe o erro e a solução é muito
simples: basta considerar que a parte que será ignorada em determinada
data não seja 0. Algumas bibliotecas fazem o fix trocando a hora para
12 e isto já resolve a grande maioria dos problemas pois as aplicações
só querem saber do componente dia/mes/ano e a hora que é ignorada pode
ser qualquer uma que não altere o componente dia/mes/ano.
Ok, como eu já esperava o flex (ou o flash player pelo que me parece)
têm o mesmo problema. Pensei comigo então que ao atribuir uma data
para um DateChooser que fosse fabricada por mim e não tivesse os
componentes de horário iguais a 0 resolveria o problema.
Infelizmente parece que o método setter do DateChooser pega minha data
e cria uma outra (grande idéia criar um outro objeto sendo que Date é
imutável... sigh)... Isto é, se eu criar uma data 18/10/2009 12:00:00
e atribuir esta data com o dateChooser.selectedDate o componente
parece que cria outra data com 0 nos componentes de horário e por fim
a minha data resultante será 17/10/2009 23:00. O pior de tudo é que o
componente dá a impressão ao usuário que a data selecionada é a 18,
pois o 18 fica com o fundo "selecionado" mas a data que seria
serializada seria 17/10/2009 23:00.

Bom, minha dúvida é: em um cenário que eu não posso simplesmente
desmarcar a opção do SO de ajuste de horário, não quero de maneira
nenhuma trafegar String (irc!) e também não desejo alterar código
fonte de ds, como eu posso solucionar o referido caso? No momento só
estou pensando na solução de escrever um componente de DateChooser e
DateField e resolver estes problemas por mim mesmo....

Escrevi o seguinte programa para testar estes casos, é bem simples e
fácil de entender. É possível ver este mesmo problema na internet até
no livedoc, poe exemplo tente seleciona 18/10/2009 no primeiro exemplo
de http://livedocs.adobe.com/flex/3/html/help.html?content=controls_12.html.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; >
        
        <mx:Script>
                <![CDATA[
                        import mx.events.CalendarLayoutChangeEvent;
                        
                        import mx.controls.DateChooser;
                        import mx.controls.Alert;
                        
                        public function onOkButton(e:MouseEvent):void
                        {
                        
                                var dt:Date = new Date(2009, 9, 18, 13, 30, 30);
                                dateChooser.selectedDate = dt;
                                var dt2:Date = dateChooser.selectedDate;
                                var dtf:DateFormatter = new DateFormatter();
                                
                                var msg:String = "";
                                
                                msg += "Propriedades individuais data bruta: 
Dia " + dt.getDate()+
" mês " + dt.getMonth() + " ano " + dt.getFullYear()+" hora
"+dt.getHours() +" minuto "+dt.getMinutes()+" segundo
"+dt.getSeconds()+"\n\n";
                                msg += "Propriedades individuais data chooser: 
Dia " +
dt2.getDate()+ " mês " + dt2.getMonth() + " ano " +
dt2.getFullYear()+" hora "+dt2.getHours() +" minuto
"+dt2.getMinutes()+" segundo "+dt2.getSeconds()+"\n\n";
                                msg += "Formatado data bruta: " 
+(dtf.format(dt)) +"\n\n";
                                msg += "Formatado data chooser: " 
+(dtf.format(dt2)) +"\n\n";
                                msg += "As duas datas são o mesmo objeto?: " 
+(dt == dt2) +"\n\n";
                                
                                textArea.text = msg;
                        
                        }
                        
                        public function 
onChangeDateChooser(e:CalendarLayoutChangeEvent):void
                        {
                                textArea.text = String(e.newDate);
                        }
                        
                ]]>
        </mx:Script>
        
        <mx:DateFormatter id="df"/>
        <mx:DateChooser id="dateChooser" yearNavigationEnabled="true"
change="onChangeDateChooser(event);" />
        <mx:Label  color="blue" text="Date selected:
{df.format(dateChooser.selectedDate)}"/>
        <mx:Button id="pesquisarButton" label="Atribuir data 18/10/2009
13:30:30 ao calendário"  click="onOkButton(event);"  />
        <mx:TextArea id="textArea" width="400" height="250" />
        
</mx:Application>

--~--~---------~--~----~------------~-------~--~----~
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
Para sair da lista, envie um email em branco para 
flexdev-unsubscr...@googlegroups.com
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---

Responder a