[SP-pm] Probleminha com datas... (Já era)

Luis Motta Campos luismottacampos em yahoo.co.uk
Quarta Maio 30 08:07:40 PDT 2007


On May 30, 2007, at 3:22 PM, Nelson Ferraz wrote:
>>    O que eu preciso fazer é obter todos os dias entre $basedate e
>> $basedate+$interval. Alguém tem alguma sugestão melhor do que um loop
>> para calcular um dia de cada vez?
>
> Você pode usar os módulos de DateTime-Set, do Flávio Glock, para
> lidar com conjuntos de datas. Por exemplo:
>
>      use DateTime;
>      use DateTime::Span;

   Minha implementação original, sem módulos:

sub list_days {
     my ( $start_date, $interval ) = @_;
     my $end_date = $start_date + DateTime::Duration->new( days =>  
$interval );
     my $pointer = $start_date->clone;
     my @days;
     while( $pointer < $end_date ) {
         push @days, $pointer->clone;
         $pointer->add( days => 1 );
     }
     return @days;
}

   A implementação usando os módulos (elegantíssimos) do Flávio Glock:

sub list_days {
     my ( $start_date, $interval ) = @_;
     return map { $_->ymd('') } DateTime::Set->from_recurrence(
         span => DateTime::Span->from_datetime_and_duration( start =>  
$basedate, days => $interval ),
         recurrence => sub { return $_[0]->is_infinite ? $_[0] : $_ 
[0]->truncate( to => 'day' )->add( days => 1 ); }
     )->as_list;
}

   @Vienna = map { $Offer::Drink( to => $_ ) } Flávio, Nélson;
   Putamplexos!
--
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}




Mais detalhes sobre a lista de discussão SaoPaulo-pm