Perl Advent Calendar 2006-12-20

Contando os dias…

por David Westbrook

Date::Calc é um conjunto de ferramentas composto por mais de 60 funções relativas a manipulação de data e hora, desde simples matemática de datas até o cálculo de datas da Páscoa. Ele pode ser uma alternativa mais simples e leve do que o DateTime ou a miríade de outros módulos para tratamento de data disponíveis. Implementado como uma biblioteca C com uma interface XS, o módulo Date::Calc segue o seu lema de "Manter-se pequeno, rápido e simples"; ele não exporta nenhuma função por padrão. É um módulo útil em problemas do dia-a-dia e, como complemento, vem com suporte para uma dúzia de idiomas diferentes.

A espera está quase terminando…

Em que mês estamos?

use Date::Calc qw/Decode_Language Language Month_to_Text/;
foreach my $lang (qw/English Français Deutsch Español Português Nederlands
                      Italiano Norsk Svenska Dansk suomi Magyar Polski/){
  Language( Decode_Language( $lang ) );
  printf "%10s: %s\n", $lang, Month_to_Text( 12 );
}

Quando é o Natal?

Mais quanto tempo devemos esperar?!?

use Date::Calc qw/Today Delta_Days/;
printf "Christmas is %d days away", Delta_Days( Today(), 2006, 12, 25 );

E se 25/12/2006 já tiver passado? Quando será o 'próximo' Natal, independentemente de qual for o ano corrente?

use Date::Calc qw/Today Delta_Days Add_Delta_YMD/;
my @next_Christmas = ( (Today)[0], 12, 25 );
if( Delta_Days( Today(), @next_Christmas ) < 0 ){
  # in case we past this year's holiday already, e.g. it's 12/28
  @next_Christmas = Add_Delta_YMD( @next_Christmas, 1, 0, 0 );
}
printf "Christmas is %d days away", Delta_Days( Today(), @next_Christmas );

Simplificações úteis

Além de prover funções para cálculo de datas, como encontrar a última segunda-feira:
$ perl -MDate::Calc=:all -e 'printf "%04d%02d%02d", Monday_of_Week( Week_of_Year(Today) )'
Também é possível verificar se uma data é válida:
use Date::Calc qw/check_date/;
my $s = '2006-12-01';
print "OK" if check_date( split(/-/,$s) );
E até mesmo produzir um calendário parecido com o do cal (apenas no modo de um mês):
$ perl -MDate::Calc=:all -e 'print Calendar( 2006, 12 )'

         December 2006
  Mon Tue Wed Thu Fri Sat Sun
                    1   2   3
    4   5   6   7   8   9  10
   11  12  13  14  15  16  17
   18  19  20  21  22  23  24
   25  26  27  28  29  30  31

Receitas deliciosas

Melhor que as receitas natalinas da vovó são as 17 receitas (link em inglês) incluídas na documentação do Date::Calc, que cobrem tópicos como a transformação de datas em strings (por exemplo: 'Segunda-feira, 25 de Dezembro de 2006'), calcular a idade de uma pessoa, encontrar uma data de pagamento, converter um valor "DATETIME" do MS Visual Basic e trabalhar com faixas de datas.

Traduzido por Nilson Santos Figueiredo Júnior.