Aller au contenu

Lua - Classer Les Jours Du Mois Par Nom (Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche)


mprinfo

Messages recommandés

Classer les jours du Mois par nom

 

(Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche)

 

 

 

Ce script permet de classer les jours du mois par le nom du jour.

 

le but de ce script est de permettre de retrouver le x jour d'un mois ou tous les jours qui ont le même nom

 

Exemple :

 

je veux le 3 mardi du mois

je veux tous les jeudi du mois

 

Si vous sauvegardez la table Jours dans une variable globale il faudra exécuter ce script tous les 01 de chaque mois vers 00h01


----------------------------------------------------------------------
-- Calcul du nombre de jours dans le mois
----------------------------------------------------------------------
-- Si année bissextile
local function bissextile(Annee)
    return Annee % 4 == 0 and (Annee % 100 ~= 0 or Annee % 400 == 0)
end
-- Nombre de jours dans le mois
function JourDansMois(Mois, Annee)
    return Mois == 2 and bissextile(Annee) and 29
           or ("\31\28\31\30\31\30\31\31\30\31\30\31"):byte(Mois)
end
----------------------------------------------------------------------
-- Initialisation des variables et creation des tables
----------------------------------------------------------------------
local MoisAnnee = os.date("*t")
local mois = MoisAnnee.month -- recuperation du mois en cours
local annee = MoisAnnee.year -- recuperation de l'annee en cours
local Jmois = JourDansMois(mois, annee) -- calcul le nombre de jour dans le mois en cours
local Jours = {["Lundi"]={}, ["Mardi"]={}, ["Mercredi"]={}, ["Jeudi"]={}, ["Vendredi"]={}, ["Samedi"]={}, ["Dimanche"]={}}
local JourNom = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"}


----------------------------------------------------------------------------------
for jour = 1,Jmois do
    local tmpdate = (os.time{year = annee, month = mois, day = jour})
    local tmpJourMois = os.date("%d", tmpdate) -- recupere le jour du mois
    local tmpJourSemaine = tonumber(os.date("%u", tmpdate)) -- Numero du jour de la de semaine
    local tmpJourNom = JourNom[tmpJourSemaine] -- recupere le nom du jour en francais
    table.insert(Jours[tmpJourNom], tmpJourMois)
    --fibaro:debug("Jour = "..tmpJourMois.."  "..tmpJourNom)
end

-----------------------------------------------------------------------
-- Affichage
-----------------------------------------------------------------------
print(os.date("Aujourd'hui, nous sommes un %A"))
fibaro:debug("Nombre de Jours dans le mois "..Jmois)

for i = 1,7 do
   local jour = JourNom[i]
   fibaro:debug(jour)
   for j = 1,#Jours[jour] do
      fibaro:debug(Jours[jour][j])
   end
end

-- Exemple d'utilisation
-- Ici on affiche le 2 lundi du mois
local toto = "Lundi"
fibaro:debug(Jours[toto][2])
-- ici on affiche le 3 lundi du mois
fibaro:debug(Jours.Mardi[3])

On peut sauvegarder la table Jours dans une variable globale afin de l'utiliser dans d'autres scripts (il faudra créer la variable globale)

-- Sauvegarde des jours de la semaine dans la variable globale JoursSemaine
fibaro:setGlobal('JoursSemaine',json.encode(Jours))

On peut récuperer cette table dans un autre script

-- Récupération des jours de la semaine de la variable globale JoursSemaine
Jours=json.decode((fibaro:getGlobal('JoursSemaine')));

Utilisation dans un Script

-------------------------------------
--      Exemple d'utilisation      --
-------------------------------------
-- Ici on affiche le 2 lundi du mois
local toto = "Lundi"
--Affichage
fibaro:debug(Jours[toto][2])
----------------------------------------------------------------------------------------------
-- ici on affiche le 3 Vendredi du mois
local Vendredi3 = Jours.Vendredi[3]
--Affichage
fibaro:debug(Vendredi3)
----------------------------------------------------------------------------------------------
-- Ici on récupere tous les mardi du mois sous forme de table
local Mardi = Jours.Mardi
--Affichage
for i = 1,#Mardi do
   fibaro:debug(Mardi[i])
end
----------------------------------------------------------------------------------------------
-- Connaitre le nombre de Samedi dans le mois
local NombreSamedi = #Jours.Samedi
--Affichage
fibaro:debug("Nombre de mardi = "..NombreSamedi)
----------------------------------------------------------------------------------------------
--Recuperer le 3 et 4 jeudi du mois
local Jeudi = {Jours.Jeudi[3], Jours.Jeudi[4]}
--Affichage
for i = 1,#Jeudi do
  fibaro:debug("Jeudi "..Jeudi[i])
end

Voici une version Virtual Device :

 

 


med_gallery_374_242_23428.png
 
Fichiers virtual device : Jours_Semaine.vfib

 

 

 


 
 
 
 

 

  • Upvote 7
Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Tiens, teste avec ça :

function isOddWeekThursday(date)
  local day, month, year = string.match(date, "(%d+)/(%d+)/(%d+)")
  myDate = os.date("*t", os.time{year = year, month = month, day = day})
  dayOne = os.date("*t", os.time{year = year, month = 1, day = 1})
  week = math.ceil((myDate.yday - dayOne.wday) / 7)
  return (myDate.wday == 5 and math.fmod(week, 2) == 1)
end

 

Modifié par OJC
Lien vers le commentaire
Partager sur d’autres sites

Salut messieurs,

 

Pour la semaine paire, voila ce qui est utilisée dans la future version GEA ;-)

 

GEA.getFrequency = function(day, number) --day : 1-31 wday :1-7 (1 :sunday)
        local t = os.date("*t")
        local semainepaire = os.date("%W") %2 == 0
        if (os.date("%A"):lower() == day:lower()) then
            return (number == 2 and semainepaire) or t["day"] < 8
        end
  end

 

Lien vers le commentaire
Partager sur d’autres sites

@Sakkhho La fonction te renvoie true si la date est un jeudi d'une semaine impaire.

 

Le (%W) est effectivement encore plus simple... Pas documenté sur le site Lua (qui parle de la v. 5.0, ça doit être postérieur...)

Modifié par OJC
  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

@Sakkhho

 

On en est à la beta 8 de GEA et @pepite (et tous les contributeurs) ne fait(font) que de me trouver des bugs ou améliorations possible.

 

On aimerait vous sortir une version fiable avec le moins de bugs possible alors malheureusement, avec nos moyens, cela prend du temps.

 

En ce qui est des nouveautés, c'est simple, c'est un peu prêt tout ce qui n'a jamais été demandé sur GEA + des trucs en plus :2:

 

- Possibilité de manipuler plusieurs modules facilement : {"turnOn", {100, 102, 103}}  -- allume les modules 100, 101 et 102

- Possibilité de l'éteindre automatiquement après x seconde : {"turnOn", 100, 60} -- 60 secondes

- Possibilité d'avoir un niveau d'imbrication : {"turnOn", 100, {"Global", "AutoExtinction}}  -- va cherche la valeur dans la variable global

- Les tant attendus {"Sleep"...},  {"Or"...}, {"Thermostatlevel"...}, {"Info"...}, {"setArmed"} ... etc etc

- Vos scénarios qui peuvent devenir des plugins de GEA

- La possibilité d'écrire vos propres contrôle/action aisément sans les perdre lors de mise à jour et de les partager si vous le souhaiter

- Plein d'actions et contrôles supplémentaires

.. bref ... 2 ou 3 petits trucs en plus :2:

 

  • Like 4
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...