Aller au contenu
mprinfo

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

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Que vois-je ? je m'absente pour emmenager dans la maison et hop un tuto de @mprinfo !! 2016 par sur de bonnes bases !!

 

Merci beaucoup

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

 Et oui, toujours sur le pont, et ça peut servir pour des tâches récurrentes spécifiques.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui la discussion initiale était pour mon besoin de TTS àdes moments donnés. (2 et 4ème mercredi de chaque mois par exemple).

Merci encore pour l aide.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

On est la pour cela c'est même le but de ce forum

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

je crois que le 69 n'ai pas sur la grille :98:

 

@Berale plus sérieusement j'ai essayé d'optimiser le code donc pas de if si tu vois des choses a optimiser je suis preneur 

Partager ce message


Lien à poster
Partager sur d’autres sites

hello,

avez vous une idée pour determiner les semaines paires et impaires ?

j'aimerai faire du TTS sur les jeudi des semaines impaires ;..

 

merci et bon dimanche

Modifié par Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

merci, je teste.

 

pour bien comprendre la fonction renvoi quoi ?

pour faire le test derriere ?

Modifié par Sakkhho

Partager ce message


Lien à poster
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

 

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

merci @OJC , et je fais ce test True sur quoi ? 

isOddWeekThursday 

 

@pepite , elle sort quand cette version de GEA ? j'ai loupé le truc - c'est quoi les nouveauté?

Modifié par Sakkhho

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

Sympa tout ça , vais finir par craquer...


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

×