• 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.

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

Notapor sarriaga » 2013-10-21 08:51 @410

Hola que tal, soy nueva en la programación Perl y necesito ayuda.

Estoy realizando un script que al seleccionar un número de semana me muestre el rango de fechas de esa semana. Ej.:

semana 52 : 23/12/2013 - 29/12/2013

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

Publicidad

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

Notapor explorer » 2013-10-21 14:58 @665

Bienvenida a los foros de Perl en Español, sarriaga.

Si tienes algo de código hecho, muéstralo, para ver dónde pueden estar los fallos, o decirte qué falta...

Saludos,
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
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-21 15:38 @693

Bien, lo que tengo es un array que serían el número de semanas del año ya que lo que estoy haciendo es armar un horario dependiendo de la información introducida por el usuario. Esto ya lo hace.

Lo que necesito es mostrar en la tabla que arme qué rango de fecha le corresponde al número de semana que aparece en la tabla.

Primero tengo esta interfaz que pide la información para armar el formulario:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub i_agregar_horarios_grupos{
  2.   my ($currentYear) =  $timestamp =~ /^(\d{4})/;
  3.   my @semanas = (1..52);
  4.   print $q->h3({-align=>'CENTER'},'Planeaci&oacuten de Horarios por Grupo'.'<br>');
  5.   print 'A&ntildeo: '.$q->popup_menu(-name=>'year', -values=>[$currentYear, $currentYear+1]);
  6.   print 'Semanas: '.$q->scrolling_list(-name=>'semanas', -values=>\@semanas, -size=>6, -multiple=>1);
  7.   print 'Grupo: '.$q->popup_menu(-name=>'grupo', -values=>['','A'..'D','MIXTO']);
  8.   print $q->submit(-name=>"||i|agregar_horarios_grupos_2||", -value=>'Continuar >').'<br><br><br>';
  9. }
  10.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Después tengo la segunda interfaz donde armo el formulario con la información que envié en la primera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub i_agregar_horarios_grupos_2{
  2.   if(scalar(@msg) == 0 || join('', @msg) =~ /rror/){
  3.     my $year = $q->param('year');
  4.     my @semanas = $q->param('semanas');
  5.     my $grupo = $q->param('grupo');
  6.     my $tabla;
  7.     foreach my $semana (@semanas){
  8.       my $row = [$year, $semana, $grupo];
  9.       push(@$row, '<input type=checkbox name=v_'.$year.'_'.$semana.'_'.$grupo." value=$_>") foreach (0..6);
  10.       #~ unshift(@$row, $q->td($fechas));
  11.       unshift(@$row, $q->td(&s_get_now)); # En esta parte requiero mostrar el rango de fecha del número de semana que le corresponde
  12.       push(@$tabla, $q->td($row));
  13.      
  14.  
  15.     }
  16.     unshift(@$tabla, $q->td([qw(<b>Fechas_semana</b> <b>A&ntildeo</b> <b>Semana</b> <b>Grupo</b> <b>Do</b> <b>Lu</b> <b>Ma</b> <b>Mi</b> <b>Ju</b> <b>Vi</b> <b>Sa</b>)]));
  17.     if(defined $tabla){
  18.       print '<br><br>';
  19.       print $q->hidden(-name=>'semanas', -value=>\@semanas, -override=>1);
  20.       print $q->hidden(-name=>'year', -value=>$year, -override=>1);
  21.       print $q->hidden(-name=>'grupo', -value=>$grupo, -override=>1);
  22.       print 'Hora de inicio 00:00 : '.$q->textfield(-name=>'hr_inicio', -size=>5).'&nbsp;&nbsp;&nbsp;&nbsp;';
  23.       print 'Duración 00:00 : '.$q->textfield(-name=>'duracion_hrs', -size=>5).'&nbsp;&nbsp;&nbsp;&nbsp;<br><br>';
  24.       print $q->table({-border=>1, -cellpadding=>2, -cellspacing=>0}, $q->Tr($tabla)).'<br><br>';
  25.       print $q->submit(-name=>"||i|agregar_horarios_grupos_2||a|agregar_horarios_grupos||", -value=>'Agregar');
  26.     }
  27.   }else{
  28.     &i_agregar_horarios_grupos();
  29.   }
  30. }
  31.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y obtengo algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Año Semana Grupo Do Lu Ma Mi Ju Vi Sa
2013   5     A        
2013   6     A    
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y quiero algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Semana  Rango_fecha_semana Grupo Do Lu Ma Mi Ju Vi Sa
  5    16/12/13 - 22/12/13   A        
  6    23/12/13 - 29/12/13   A        
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Tengo una subrutina para obtener el número de semana a partir de una fecha pero yo quiero hacer lo contrario.

De antemano, muchas 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-21 19:35 @857

Todo lo que tenga que ver con fechas, pues se debería usar DateTime, pero con Date::Calc también se pueden hacer cosillas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use Date::Calc qw(Monday_of_Week Add_Delta_Days);
  4.  
  5. print "Introduzca número de la semana y año (ww aaaa): "; my $fecha = <STDIN>;
  6. #chomp $fecha;
  7.  
  8. my($semana, $anno) = split " ", $fecha;
  9.  
  10. my($anno_lunes, $mes_lunes, $dia_lunes) = Monday_of_Week($semana, $anno);
  11.  
  12. print "Lunes:   $dia_lunes/$mes_lunes/$anno_lunes\n";
  13.  
  14. my($anno_domingo, $mes_domingo, $dia_domingo) = Add_Delta_Days($anno_lunes, $mes_lunes, $dia_lunes, 6);
  15.  
  16. print "Domingo: $dia_domingo/$mes_domingo/$anno_domingo\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Ejemplos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@joaquinferrero:~/Documentos/Desarrollo> perl kk.pl
Introduzca número de la semana y año (ww aaaa): 43 2013
Lunes:   21/10/2013
Domingo: 27/10/2013
explorer@joaquinferrero:~/Documentos/Desarrollo> perl kk.pl
Introduzca número de la semana y año (ww aaaa): 9 2013
Lunes:   25/2/2013
Domingo: 3/3/2013
explorer@joaquinferrero:~/Documentos/Desarrollo> perl kk.pl
Introduzca número de la semana y año (ww aaaa): 1 2013
Lunes:   31/12/2012
Domingo: 6/1/2013
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Fíjate que incluso se ocupa de saber si es un año bisiesto o no. Y el comienzo de año sigue la norma ISO 8601 1998.

Esta es otra versión, más reducida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.10;
  3. use utf8::all;
  4. use Date::Calc qw(Monday_of_Week Add_Delta_Days);
  5.  
  6. print "Introduzca número de la semana y año (ww aaaa): "; my $fecha = <STDIN>;
  7. my($semana, $año) = split " ", $fecha;
  8.  
  9. my @lunes   = Monday_of_Week($semana, $año);    # lunes al que corresponde esa semana
  10. my @domingo = Add_Delta_Days(@lunes, 6);        # al lunes le sumamos seis días
  11.  
  12. my $fmt     = "%02d/%02d/%04d";
  13. my $lunes   = sprintf $fmt, reverse @lunes;     # valores formateados a dd/mm/aaaa
  14. my $domingo = sprintf $fmt, reverse @domingo;
  15.  
  16. say "$lunes - $domingo";
Coloreado en 0.001 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: 14480
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-21 21:31 @938

¡Excelente! ¡Voy a aplicarlo en mi script y ver cómo me funciona!
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 sarriaga » 2013-10-22 10:25 @476

He probado el último script con mi script y me arroja este error:

Malformed UTF-8 character (unexpected non-continuation byte 0x6f, immediately after start byte 0xf1)

Ya instalé los módulos Date::Calc y utf8::all. No sé qué me esté faltando.

Saludos
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 sarriaga » 2013-10-22 10:40 @486

¡Listo! Lo agregué en un script él solo y funciona muy bien. Sólo falta agregar los módulos al servidor para mi script general y que las semanas las tome de un array. Agradezco la ayuda :D
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 sarriaga » 2013-10-22 10:59 @499

Una duda más: este módulo inicia la semana en lunes. ¿Cómo podría configurar esto para que empiece en domingo ya que mi script inicia la semana en domingo?

Saludos
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 12:15 @552

¿Estás segura de que quieres que empiece en domingo? Sería contrario a las normas de estandarización ISO/R 2015-1971, DIN 1355 y la ya mencionada ISO 8601.

En fin... cosas más raras hemos visto... :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.16;
  3. use utf8::all;                  # Turn on UTF-8. All of it.
  4. use Date::Calc qw(Monday_of_Week Add_Delta_Days);
  5.  
  6. print "Introduzca número de la semana y año (ww aaaa): "; my $fecha = <STDIN>;
  7. #chomp $fecha;
  8.  
  9. my($semana, $año) = split " ", $fecha;
  10.  
  11. my @domingo = Add_Delta_Days(Monday_of_Week($semana, $año), -1);        # domingo anterior al lunes al que corresponde esa semana
  12. my @sábado  = Add_Delta_Days(@domingo, 6);                              # a ese domingo le sumamos seis días
  13.  
  14. my $fmt     = "%02d/%02d/%04d";
  15. my $domingo = sprintf $fmt, reverse @domingo;                           # valores formateados a dd/mm/aaaa
  16. my $sábado  = sprintf $fmt, reverse @sábado;
  17.  
  18. print "$domingo - $sábado\n";
Coloreado en 0.001 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: 14480
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-22 12:34 @565

¡ja,ja,ja, lo sé! Mi semana empieza en domingo ya que tengo un script adicional que obtiene la fecha desde el servidor y mi servidor cuenta los días empezando desde domingo al cual le asigna el número de día 0, por lo tanto la conversión de mi semana debe ser desde 0.

Me ha sido de gran ayuda este foro. Gracias.
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados