TUTORIAL JAVA + FLEX NA PRÁTICA (8) – Datas

"O QUE È BOM TEM QUE CONTINUAR"        "O SENTIMENTO NÂO PODE PARAR"

Ano de 2010 começa e a vontade de ajudar a comunidade java e flex aumenta, e como podem perceber reativo hoje o Tutorial mais bombado do meu blog(JAVA + FLEX NA PRÀTICA) e os Motivos para reativar esse tutorial foi:

  • Percebi que o público do meu blog é uma galera que busca um pouco além de pequenas dicas, gostaram é de tutorial.
  • É mais fácil dar continuidade neste tutorial e mostrar algumas coisas mais avançadas ou continua de que começar outra, ter que ficar explicando d+, ter que no final ficar no básico.
  • Muitas dúvidas por email que valem um novo post para explicações, atualizações e dicas.
  • Quem sabe não sai um Ebook legal aí ,hein! ;)

Então se prepara, pegue um café que no Tutorial Java + Flex Na Prática (8) - Datas você vai aprender como trabalhar com datas usando Flex e Java (já que essa é a dúvida campeão da galera por email).

Para você que ainda não leu esses artigos para facilitar lá vai

Esse artigo é continuação do

TUTORIAL JAVA + FLEX NA PRÁTICA 1/6

TUTORIAL JAVA + FLEX NA PRÁTICA 2/6

TUTORIAL JAVA + FLEX NA PRÁTICA 3/6

TUTORIAL JAVA + FLEX NA PRÁTICA 4/6

TUTORIAL JAVA + FLEX NA PRÁTICA 5/6

TUTORIAL JAVA + FLEX NA PRÁTICA 6/6

TUTORIAL JAVA + FLEX NA PRÁTICA 7/6 – Bônus

Caso queira o projeto java é só baixar aqui (sem as libs).

Caso queira o projeto java é só baixar aqui.(com as libs).

Caso queira o projeto flex é só baixar aqui.

TRABALHANDO COM DATAS NO JAVA  + FLEX

Sim, parece simples mas causa uma dúvida na galera que começa com JAVA + FLEX, seja na parte java com qual anotação usar ou seja no flex como pegar os valores em DD/MM/YYYY e converter em YYYY/MM/DD (já que é nesse formato que se armazena data no banco) . Tem muita gente que esquece que é data, se estressa e trata como se fosse string, nada contra mas se quiser pode aproveitar esse artigo para trabalhar Data como Data... vamos começar :)

A primeira coisa que vamos fazer é acrescentar um novo atributo na nossa entidade Cidade, vamos acrescentar a data de fundação(lógico que isso é redículo mas é um exemplo, ok) e com sua anotação correta.Vamos adicionar o atributo na nossa entidade:

JAVA:
  1. @Temporal(TemporalType.DATE)
  2.  
  3. private Date dataFundacao;
  4.  
  5. public Date getDataFundacao() {
  6.  
  7. return dataFundacao;
  8.  
  9. }
  10.  
  11. public void setDataFundacao(Date dataFundacao) {
  12.  
  13. this.dataFundacao = dataFundacao;
  14.  
  15. }

simples não, apenas vale lembrar que o Date é o "java.util.Date" e não "java.sql.Date", vamos agora pro flex que aqui acabou, perceberam como OO ajuda... mexemos em uma classe, o resto fica do jeito que está :)

No Flex adicionamos a atributo também na nossa entidade que é nosso clone da Cidade:

ACTIONSCRIPT:
  1. public var dataFundacao:Date;

Agora, vamos criar um componente customizado, na verdade vamos extender o componente data Padrão do Flex (o DateField) chamei de DateFieldpt, só um detalhe, achei esse componente na net e não vou dar créditos pois não sei quem fez, então dentro do nosso projeto vamos criar um package components e vamos adicionar esse nosso componente, vamos ao código:

ACTIONSCRIPT:
  1. package com.saberprogramar.components
  2.  
  3. {
  4.  
  5. import com.saberprogramar.utils.Util;
  6.  
  7. import mx.controls.DateField;
  8.  
  9. import mx.events.FlexEvent;
  10.  
  11. public class DateFieldpt extends DateField
  12.  
  13. {
  14.  
  15. private const diasNomes:Array = ["D","S","T","Q","Q","S","S"];
  16.  
  17. private const mesesNomes:Array = ["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"];
  18.  
  19. public function DateFieldpt() {
  20.  
  21. super();
  22.  
  23. this.width=95;
  24.  
  25. dayNames=diasNomes;
  26.  
  27. monthNames=mesesNomes;
  28.  
  29. formatString="DD/MM/YYYY";
  30.  
  31. restrict="0-9";
  32.  
  33. editable=true;
  34.  
  35. showToday=true;
  36.  
  37. text = Util.dateToString(new Date());
  38.  
  39. addEventListener(FlexEvent.VALUE_COMMIT,completar);
  40.  
  41. }
  42.  
  43. private function completar(event:FlexEvent):void {
  44.  
  45. var str:String = event.target.text as String;
  46.  
  47. if ( str.charAt(2) != "/" || str.charAt(5) != "/" ) {
  48.  
  49. var mask:String;
  50.  
  51. var dataAtual:Date = new Date();
  52.  
  53. if ( str.length == 2 ) {
  54.  
  55. mask = str.substr(0, 2) + "/" +
  56.  
  57. (dataAtual.getMonth()+1).toString() + "/" +
  58.  
  59. dataAtual.getFullYear();
  60.  
  61. event.target.text = mask;
  62.  
  63. }
  64.  
  65. else if ( str.length == 4 ) {
  66.  
  67. mask = str.substr(0, 2) + "/" + str.substr(2,2) + "/" +
  68.  
  69. dataAtual.getFullYear().toString();
  70.  
  71. event.target.text = mask;
  72.  
  73. }
  74.  
  75. else if ( str.length == 6 ) {
  76.  
  77. mask = str.substr(0, 2) + "/" + str.substr(2,2) + "/" +
  78.  
  79. str.substr(4, 4);
  80.  
  81. event.target.text = mask;
  82.  
  83. }
  84.  
  85. else if ( str.length == 8 ) {
  86.  
  87. mask = str.substr(0, 2) + "/" + str.substr(2,2) + "/" +
  88.  
  89. str.substr(4, 4);
  90.  
  91. event.target.text = mask;
  92.  
  93. }
  94.  
  95. }
  96.  
  97. }
  98.  
  99. }
  100.  
  101. }

além desse componente precisamos de uma função que converta data para string e string para data, então crie mais um package utils e crie sua classe(sugeri Util.as) com essas funções, vamos ao código:

ACTIONSCRIPT:
  1. package com.saberprogramar.utils
  2.  
  3. {
  4.  
  5. import mx.formatters.DateFormatter;
  6.  
  7. public class Util
  8.  
  9. {
  10.  
  11. public static function stringToDate(data:String):Date{
  12.  
  13. if (data != "") {
  14.  
  15. var novaData:String = data.substring(3,5) +"/"+ data.substring(0,2) +"/"+ data.substring(6);
  16.  
  17. return new Date(novaData);
  18.  
  19. }
  20.  
  21. else {
  22.  
  23. return null;
  24.  
  25. }
  26.  
  27. }
  28.  
  29. public static function dateToString(data:Date):String{
  30.  
  31. var format:DateFormatter = new DateFormatter();
  32.  
  33. format.formatString = "DD/MM/YYYY";
  34.  
  35. return format.format(data);
  36.  
  37. }
  38.  
  39. }
  40.  
  41. }

pronto, agora é moleza,adicionamos um novo campo na view que é o nosso componente customizado:

CODE:
  1. <mx:FormItem label="Data Fundação:" required="true">
  2.                     <components:DateFieldpt id="txtDataFundcao"
  3.                         text="{Util.dateToString(cidade.dataFundacao)}" tabIndex="4" />
  4.                 </mx:FormItem>

e pra finalizar em nossa action na function confirm adicionamos isso:

ACTIONSCRIPT:
  1. cidade.dataFundacao = Util.stringToDate(txtDataFundcao.text);

pronto, testa aí e você vai ver que já está funcionando, mas espera aí, ainda falta uma grande dica.

O HORÀRIO DE VERÂO BRASILEIRO!

Você vai testar agora, vai ver que está funcionando, vai ficar feliz e depois de um tempo pode acontecer de ter problemas com o nosso bendito horário de verão, explico, no Brazil não temos dia certo pra começar nem para terminar o bendito horário de verão, então como o sdk do java não utiliza a informaçao do sistema operacional(Windows, Linux, Mac) e sim do prório sdk, o sdk fica perdido com o nosso horário de verão. Mas como saber que estou tendo problemas?

  • Quando você mandar gravar uma data (23/01/2010)  essa data vai retroceder um dia (22/01/2010). Putz kara, é exatamente o que está me acontecendo, como eu resolvo isso?

simples :) um POG do bem..hehe quando você manda gravar uma data como fazemos aqui a data vai com o time (00:00:00), então quando chega no java o time volta, consequentemente um dia anteior com o time (22:00:00 ou as 23:00:00), então a forma mais rápida foi setar o time para 12:00:00 e por mais que o sdk volte o time ainda será o mesmo dia :) , então na nossa classe Util na função stringToDate ficará assim:

ACTIONSCRIPT:
  1. public static function stringToDate(data:String):Date{
  2.  
  3. if (data != "") {
  4.  
  5. var novaData:String = data.substring(3,5) +"/"+ data.substring(0,2) +"/"+ data.substring(6);
  6.  
  7. var dateTime:Date = new Date(novaData);
  8.  
  9. dateTime.setHours(12,0,0,0);
  10.  
  11. return dateTime;
  12.  
  13. }
  14.  
  15. else {
  16.  
  17. return null;
  18.  
  19. }
  20.  
  21. }

fica aí a dica, aguardem que vem novos artigos para este tutorial, como atualização de swiz e relatórios integrando JAVA + FEX + IREPORT, até a próxima e bons estudos.

Cumps.

Popularity: 32% [?]

Tags: , , , , ,

Categoria(s):#JAVA + FLEX NA PRÁTICA, Action Script 3.0, Adobe Flex, Componentes, Dicas


Outros Artigos:

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

3 Responses to “TUTORIAL JAVA + FLEX NA PRÁTICA (8) – Datas”

  1. Davi Gritz disse:

    Janderson,
    Realmente trabalhar com datas com java da muita dor de cabeça.
    Parabens pelo artigo
    abraço

  2. [...] This post was mentioned on Twitter by Paulo Fagundes Stos, Janderson F.Cardoso and Daniel Pace Schmitz, Fabiano Frizzo. Fabiano Frizzo said: RT @jandersonfc:New blog post: TUTORIAL JAVA + FLEX NA PRÁTICA (8) - Datas http://bit.ly/8mAsid [...]

Leave a Reply