Desenvolvimento web » dicas
Convertendo “pubDate” do RSS para formato brasileiro via javascript
Deixe seu comentárioDe 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: data, Date, funcao, javascript, rss
José 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.