• Publicidad

Obtener rango de fecha a partir de número de semana

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Obtener rango de fecha a partir de número de semana

Notapor explorer » 2013-10-22 15:51 @702

Eso es que el servidor está funcionando con una localización anglosajana.

La solución es usar una programación lo más independiente del sistema posible.

Por ejemplo, si usas Perl, con la función localtime (o gmtime) obtienes la fecha local (o relativa a GMT) según la hora/fecha del servidor.

Desde la línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -E '($d,$m,$y,$dw) = (localtime)[3,4,5, 6]; say join "/", $d, $m+1, $y+1900, $dw' # 22/10/2013/2
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

El valor de $dw es el del día de la semana, siendo 0 el domingo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Obtener rango de fecha a partir de número de semana

Notapor sarriaga » 2013-10-22 15:58 @707

El módulo me funciona de maravilla, pero ¿qué pasa si lo que obtengo quiero ponerlo en un scrolling_list?? Tengo lo siguiente pero no me muestra nada.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   my ($currentYear) =  $timestamp =~ /^(\d{4})/;
  2.   my @semanas = (1..52);
  3.   my ($domingo, $sabado, @dates, %dates);
  4.  
  5.   foreach my $semana (@semanas){
  6.     my @domingo  = Add_Delta_Days(Monday_of_Week($semana, $currentYear), -1);
  7.     my @sabado = Add_Delta_Days(@domingo, 6);    
  8.     my $fmt     = "%02d/%02d/%04d";
  9.     $domingo   = sprintf $fmt, reverse @domingo;    
  10.     $sabado = sprintf $fmt, reverse @sabado;
  11.     %dates= "$semana". " $domingo - $sabado";
  12.     print "%dates\n";
  13.   }
  14.  
  15.   print 'Semanas: '.$q->scrolling_list(-name=>'semanas', -values=>\@semanas, -labels=>\%dates, -size=>6, -multiple=>1);
  16.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Gracias
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Obtener rango de fecha a partir de número de semana

Notapor explorer » 2013-10-22 16:22 @724

La línea 11 está mal. Creo que es así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     $dates{$semana} = "$domingo - $sabado";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Atención: hay años que tienen 53 semanas... :)

Una manera de solventarlo, es hacer un bucle, hasta que la función nos devuelva un error.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use utf8::all;
  3.  
  4. use CGI qw(:standard);
  5. use Date::Calc qw(Monday_of_Week Add_Delta_Days);
  6.  
  7. my %semanas;
  8. my @semanas;
  9.  
  10. my ($añoActual) = 1900 + (localtime)[5];
  11. my $semana      = 1;
  12. my $fmt         = "%02d/%02d/%04d";
  13. $fmt            = "$fmt - $fmt";
  14.  
  15. while (my @lunes = eval { Monday_of_Week($semana, $añoActual) }) {
  16.     push @semanas, $semana;
  17.  
  18.     $semanas{$semana}
  19.         = sprintf $fmt,
  20.             reverse(Add_Delta_Days(@lunes, -1)),       # domingo
  21.             reverse(Add_Delta_Days(@lunes,  5));       # sábado
  22.  
  23.     $semana++;
  24. }
  25.  
  26. print
  27.     'Semanas: ',
  28.     scrolling_list(
  29.         -name     =>  'semanas',
  30.         -values   => \@semanas,
  31.         -labels   => \%semanas,
  32.         -size     => 6,
  33.         -multiple => 1,
  34.     ),
  35.     ;
  36.  
  37. __END__
  38.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Usamos el truco del eval{} y así capturamos el error que se produce al pasarle un número de semana ilegal. Entonces ahí @lunes no recibe nada, con lo que el while termina.

Se han quitado casi todas las variables, por no ser necesarias.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Semanas: <select name="semanas"  size="6" multiple="multiple">
<option value="1">30/12/2012 - 05/01/2013</option>
<option value="2">06/01/2013 - 12/01/2013</option>
<option value="3">13/01/2013 - 19/01/2013</option>
<option value="4">20/01/2013 - 26/01/2013</option>
<option value="5">27/01/2013 - 02/02/2013</option>
<option value="6">03/02/2013 - 09/02/2013</option>
<option value="7">10/02/2013 - 16/02/2013</option>
<option value="8">17/02/2013 - 23/02/2013</option>
<option value="9">24/02/2013 - 02/03/2013</option>
<option value="10">03/03/2013 - 09/03/2013</option>
<option value="11">10/03/2013 - 16/03/2013</option>
<option value="12">17/03/2013 - 23/03/2013</option>
<option value="13">24/03/2013 - 30/03/2013</option>
<option value="14">31/03/2013 - 06/04/2013</option>
<option value="15">07/04/2013 - 13/04/2013</option>
<option value="16">14/04/2013 - 20/04/2013</option>
<option value="17">21/04/2013 - 27/04/2013</option>
<option value="18">28/04/2013 - 04/05/2013</option>
<option value="19">05/05/2013 - 11/05/2013</option>
<option value="20">12/05/2013 - 18/05/2013</option>
<option value="21">19/05/2013 - 25/05/2013</option>
<option value="22">26/05/2013 - 01/06/2013</option>
<option value="23">02/06/2013 - 08/06/2013</option>
<option value="24">09/06/2013 - 15/06/2013</option>
<option value="25">16/06/2013 - 22/06/2013</option>
<option value="26">23/06/2013 - 29/06/2013</option>
<option value="27">30/06/2013 - 06/07/2013</option>
<option value="28">07/07/2013 - 13/07/2013</option>
<option value="29">14/07/2013 - 20/07/2013</option>
<option value="30">21/07/2013 - 27/07/2013</option>
<option value="31">28/07/2013 - 03/08/2013</option>
<option value="32">04/08/2013 - 10/08/2013</option>
<option value="33">11/08/2013 - 17/08/2013</option>
<option value="34">18/08/2013 - 24/08/2013</option>
<option value="35">25/08/2013 - 31/08/2013</option>
<option value="36">01/09/2013 - 07/09/2013</option>
<option value="37">08/09/2013 - 14/09/2013</option>
<option value="38">15/09/2013 - 21/09/2013</option>
<option value="39">22/09/2013 - 28/09/2013</option>
<option value="40">29/09/2013 - 05/10/2013</option>
<option value="41">06/10/2013 - 12/10/2013</option>
<option value="42">13/10/2013 - 19/10/2013</option>
<option value="43">20/10/2013 - 26/10/2013</option>
<option value="44">27/10/2013 - 02/11/2013</option>
<option value="45">03/11/2013 - 09/11/2013</option>
<option value="46">10/11/2013 - 16/11/2013</option>
<option value="47">17/11/2013 - 23/11/2013</option>
<option value="48">24/11/2013 - 30/11/2013</option>
<option value="49">01/12/2013 - 07/12/2013</option>
<option value="50">08/12/2013 - 14/12/2013</option>
<option value="51">15/12/2013 - 21/12/2013</option>
<option value="52">22/12/2013 - 28/12/2013</option>
</select>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener rango de fecha a partir de número de semana

Notapor sarriaga » 2013-10-23 08:16 @386

Mil gracias, realmente funciona, ya tengo mi script completo y funcionando :D
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron