Ejecutar una tarea el primer día laborable de cada mes

comercialEl colega Yoandry preguntó en la lista GUTL sobre posibles soluciones para preparar un script que resuelva este problema.

Una de ellas es guardar en un arreglo del script el listado del
primer día laborable de cada mes.

Quien dice arreglo puede decir una cadena: un substr o su equivalente podría revisar la cadena a ver si el día coincide. Las variantes dependen solo de nuestra imaginación.

Por ejemplo, en Python, usar una estructura de diccionario.

Conociendo previamente el mes en que estoy (por ejemplo, extrayéndolo
con date), hacer algo como:

dicdias={‘enero’:4,’febrero’:1,’marzo’:1}

for labora in dicdias:
if mes_en_que_estoy=labora:
este_es=labora[1]

Otra variante, si se nos ocurriera hacer ese script en Python (estoy
explorándolo, y me ha gustado): existe la posibilidad de usar una
estructura similar a la de los ficheros de configuración,
específicamente

[laborables]
1=4
2=1
3=1

guardada en un fichero fechas.cfg, por ejemplo.

En el cuerpo del script se usaría una instrucción
cparser.read(fechas.cfg).

A continuación se recorrería el item laborables con un ciclo:

for labora in cparser.items(‘laborables’):
if mes_en_que_estoy=labora:
este_es=labora[1]

con lo cual ya tendría en este_es el primer día laboral del mes.

Una idea como esta abre la posibilidad de crear un script que no
solamente trate el caso señalado (primer día laborable del mes) sino
también otras fechas señaladas, como festivos, sábados laborables
intercambiados por no laborables, etc., a condición de especificar en
cparser.items qué sección debo buscar (‘festivos’, ‘cambiados’,
‘aniversarios’), la que sea.

El tal script sería lanzado por cron.

Como es habitual, en la lista  se hicieron otras propuestas. El amigo Hugo Florentino preparó un script para ser ejecutado en dash (no bash).

Cita:

La solución que puse antes no cubría el caso de que el primer día del
>> mes no sea lunes, así que por mero ejercicio intelectual hice el
>> siguiente script:
>>
>> #! /bin/sh
>>
>> # Obtener el número del día en el mes
>> DIAMES=$(expr `date +%d` + 0)
>>
>> # Obtener el número del día en la semana, del 1 al 7 (1 es lunes).
>> DIASEM=$(expr `date +%u` + 0)
>>
>> # Variable para evaluación final
>> PRIMERDIALABORAL=0
>>
>> # Evaluación para establecer el valor de la variable
>> if [ ${DIAMES} -eq 1 ]; then
>>     if [ 6 -gt ${DIASEM} ]; then
>>       PRIMERDIALABORAL=1
>>     fi
>> elif [ ${DIAMES} -le 3 ]; then
>>     if [ 2 -gt ${DIASEM} ]; then
>>       PRIMERDIALABORAL=1
>>     fi
>> fi
>>
>> # Evaluar el valor de la variable
>> if [ ${PRIMERDIALABORAL} -eq 1 ]; then
>>     echo “Depuración: Este es el primer día laboral del mes.”
>>     # Insertar aquí las acciones a tomar
>> else
>>     echo “Depuración: Este no es el primer día laboral del mes.”
>> fi
>>
>> exit 0
>>
>>
>> Noten que como mis sistemas no corren bash por defecto sino dash, en lo
>> posible prefiero evitar las comparaciones de igualdad y favorezco las
>> comparaciones por valores numéricos para que mis scripts sean más
>> portables, pero obviamente que esto es una preferencia personal.
>>
>> Saludos, Hugo
>>

Fin de la cita

Pero el colmo de la concisión fue una propuesta del colega Arley Consuegra, en Ruby:

Cita:

“Con ruby puedes detectar si es lunes y primer día del mes con esto:

# Si es lunes y es día primero
if Time.now.wday == 1 and Time.now.day == 1

puts “Es hora de hacer algo.”
end”

Fin de la cita

Claro que el primer día laborable del mes puede caer en otro día de la semana, pero me asombra la concisión del lenguaje.

Da gusto participar en la lista GUTL! (http://gutl.jovenclub.cu)

Esta entrada fue publicada en Software Libre. Guarda el enlace permanente.

3 respuestas a Ejecutar una tarea el primer día laborable de cada mes

  1. Koratsuki dijo:

    Se que no es el lugar pero a mi el sitio de GUTL me da error -> Se agotó el tiempo de espera…

    Se sabe algo al respecto?

  2. Ich dijo:

    Acá te pongo el código para obtener el primer día laborable, caiga lunes o no.
    Si instalas ruby desde el repo tienes que instalar también el paquete ruby-activesupport

    # coding: utf-8
    require ‘active_support’
    require ‘active_support/time’

    def primer_dia_laborable(t)
    if laborable?(t)
    t
    else
    primer_dia_laborable(t.succ)
    end
    end

    def laborable?(t)
    if !t.sunday? and !t.saturday?
    return true
    end
    end

    hoy = Time.now.to_date
    inicio_mes = hoy.beginning_of_month

    if primer_dia_laborable(inicio_mes) == hoy
    puts “Hoy es el primer día laborable.”
    end

  3. mayralberto dijo:

    Pues doblemente agradecido.
    Primero por que alguien lea este blog y lo haya encontrado útil.
    Y en segundo lugar, por la colaboración.

    Fumero

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *