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