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.

Sobre

Minha fotoJosé Luiz Coe é meu nome, Zeck é meu apelido. Sou engenheiro de computação de formação, webmaster de profissão e fotógrafo por diversão.

Aqui você encontra um pouco do meu trabalho e fica sabendo o que eu penso.

Vale lembrar que tudo que está aqui neste site nada tem a ver com a opinião da empresa onde eu porventura esteja trabalhando.

Continuar lendo »

Créditos

Este site é fruto de uma salada de recursos plugados ao gerenciador de conteúdo Wordpress.

Hospedagem: Dreamhost

Arquivo

Localize o conteúdo que você procura utilizando este espaço.

2010: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2009: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2008: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2006: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2005: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec


Assine

Feeds por categoria: