2009 Mar 13

Convertendo “pubDate” do RSS para formato brasileiro via javascript

Deixe seu comentário

De uns tempos pra cá venho estudando javascript e, como não gosto de estudar sem praticar, resolvi fazer um mini leitor de RSS.

Um dos problemas que me deparei foi quando precisei trazer a data em formato "amigável". A data (pubDate) do RSS segue as normas da RFC822. Traduzindo, temos uma data assim:

>>"Sun, 15 Feb 2009 05:01:34 -0200"

Para o usuário comum, este formato de data não quer dizer muita coisa. Precisei, "traduzir".

O objeto que trabalha com datas no javascript é o Date(). Este objeto possui um método chamado "parse", que recebe uma string no formato da RFC822 (pubDate) e retorna um timestamp no formato UTC.

 
var timestamp = Date.parse("Sun, 15 Feb 2009 05:01:34 -0200");
timestamp
>> 1234681294000
 

Bom, agora que temos a data no formato UTC, tudo fica mais fácil. O objeto Date() possui vários métodos para trabalhar com UTC, tais como:

  • getUTCDate(), que retorna o dia de 1 a 31.
  • getUTCMonth(), que retorna o mês de 0 a 11, ou seja, precisamos somar 1 para termos o mês numericamente correto ou usar assim para o caso de um array auxiliar com meses por extenso.
  • getUTCFullYear(), que retorna o ano com 4 digitos
  • getUTCHours(), que retorna a hora de 0 a 23.
  • getUTCMinutes(), que retorna os minutos de 0 a 59

Com as funções acima em mãos, fica mais fácil fazer o resto.

 
var timestamp  = Date.parse("Sun, 15 Feb 2009 05:01:34 -0200");
var data_brasil = new Date(timestamp);
var dia   = data_brasil.getUTCDate();
var mes  = data_brasil.getUTCMonth()+1;
var ano  = data_brasil.getUTCFullYear();
[dia,mes,ano].join("/");
>> "15/02/2009"
 

Mas, ainda não está "bonito". Podemos tranformar isso em uma função.

 
function pubdateToBr(pubDate){
 
  var timestamp   = Date.parse(pubDate);
  var data_brasil = new Date(timestamp);
  var dia         = data_brasil.getUTCDate();
  var mes         = data_brasil.getUTCMonth()+1;
  var ano         = data_brasil.getUTCFullYear();
 
  return [dia,mes,ano].join("/");
}
 

A chamada no seu código passaria a ser:

 
pubdateToBr("Sun, 15 Feb 2009 05:01:34 -0200")
>> "15/02/2009"
 

Bom, se você veio atrás de uma função para resolver algo pontual, se quiser, já pode parar por aqui. Mas... dá para viajar mais um pouco. Podemos ter nosso próprio objeto para manipular datas.

 
// Criando objeto, que recebe pubDate como parametro de entrada.
function myDate(pubDate){
  this.timestamp   = Date.parse(pubDate);                 // propriedade timestamp
  this.data_brasil = new Date(timestamp);                 // propriedade data_brasil
  this.dia         = this.data_brasil.getUTCDate();         // propriedade dia
  this.mes         = this.data_brasil.getUTCMonth()+1;  // propriedade mes
  this.ano         = this.data_brasil.getUTCFullYear();    // propriedade ano
  this.hora        = this.data_brasil.getUTCHours();       // propriedade hora
  this.minuto      = this.data_brasil.getUTCMinutes();   // propriedade minuto
 
  // com as propriedades acima, podemos criar várias combinações
  // que podem ser uteis no futuro
 
  this.dia_mes     = function(){
    // retorna "DIA/MES". Ex: 15/2. Note que temos um array com dois elementos que
    // são concatenados com uma barra "/", utilizando o método "join".
    return [this.dia, this.mes].join("/");
  }
 
  this.dia_mes_ano     = function(){
    // retorna "DIA/MES/ANO". Ex: 15/2/2009. Note que temos um array com dois elementos que
    // são concatenados com uma barra "/", utilizando o método "join".
    return [this.dia_mes(), this.ano].join("/");
  }
 
  this.hora_minuto     = function(){
    // retorna "HORA:MINUTO". Ex: 15:30. Note que temos um array com dois elementos que
    // são concatenados com dois pontos ":", utilizando o método "join".
    return [this.hora, this.minuto].join(":");
  }
 
  this.data_hora = function (){
    // retorna "DIA/MES/ANO HORA:MINUTO". Ex: "15/2/2009 15:30". Note que temos um array com
    // dois elementos que são concatenados com dois espaço em branco " ", utilizando o método "join".
    return [this.dia_mes_ano(), this.hora_minuto()].join(" ");
  }
 
}
 

Exemplos de utilização:

 
d = new myDate("Sun, 15 Feb 2009 05:01:34 -0200"); // instanciando objeto myDate
d.dia;
>> "15"
 
d.mes
>> "2"
 
d.ano
>> "2009"
 
d.dia_mes
>> "15/2"
 
d.dia_mes_ano
>> "15/2/2009"
 
d.hora_minuto
>> "05:01"
 
d.data_hora
>> "15/2/2009 05:01"
 

O código acima dá para ser melhorado (e como), mas seria informação demais para um post só. :)

Espero que tenha sido fácil de entender. De posse destas informações eu acho que agora fica mais simples trabalhar com as datas sem precisar ficar fazendo "split" na string.

Valeu, pessoal!

tags: , , , ,

Deixe seu comentário

Utilize os campos abaixo para digitar sua opinião bem como seus dados. Vale lembrar que seu email nunca será divulgado aqui no site, ele serve apenas para que eu possa responder a mensagem para você e que da próxima vez que você comentar eu não precise aprovar.

Assine

Feeds por categoria: