Cronwise

Caractères spéciaux Quartz : L, W et # expliqués

Un guide approfondi au niveau des tokens pour les opérateurs L, W et # de Quartz afin de construire des planifications précises sans surprises à l'exécution.

Ouvrir le générateur Quartz

Pourquoi les caractères spéciaux Quartz sont importants

La plupart des erreurs cron commencent avant le déploiement, lorsque l'intention de planification et la syntaxe divergent. Le cron standard à cinq champs couvre les minutes, heures, jour du mois, mois et jour de la semaine. Quartz étend cela avec un champ secondes, un champ année et trois caractères spéciaux — L, W et # — qui offrent une précision de planification que le cron standard ne peut égaler.

Ces caractères se comportent différemment selon le champ dans lequel ils apparaissent, et de petites incompréhensions se propagent en planifications qui se déclenchent le mauvais jour ou sautent complètement des exécutions. Cet article explique chaque caractère avec des exemples pratiques, des vérifications de validation et des actions concrètes que vous pouvez effectuer dans le générateur Quartz de Cronwise.

Le caractère L : dernier jour et dernier jour ouvrable

L signifie « dernier » et est valide dans deux champs : jour du mois et jour de la semaine. Sa signification change selon l'endroit où vous le placez.

L dans le jour du mois

Utilisé seul, L signifie le dernier jour du mois. L'expression 0 0 18 L * ? se déclenche à 18 h 00 le dernier jour de chaque mois — que ce soit le 28, le 29, le 30 ou le 31. Vous n'avez jamais besoin de coder en dur les longueurs de mois.

Vous pouvez combiner L avec un décalage négatif. L-3 signifie trois jours avant le dernier jour. Dans un mois de 31 jours, cela correspond au 28 ; en février d'une année non bissextile, cela correspond au 25. C'est utile pour les fenêtres de clôture de facturation.

L dans le jour de la semaine

Dans le champ jour de la semaine, vous associez L à un numéro de jour : 6L signifie le dernier vendredi du mois. L'expression 0 0 9 ? * 6L se déclenche à 9 h 00 le dernier vendredi de chaque mois — utile pour le traitement de la paie ou les rapports de fin de mois qui doivent tomber un jour de la semaine spécifique.

Le caractère W : jour ouvrable le plus proche

W est valide uniquement dans le champ jour du mois. Il sélectionne le jour ouvrable le plus proche (lundi au vendredi) de la date spécifiée. Écrivez 15W pour signifier « le jour ouvrable le plus proche du 15 ».

Comment W se résout

Si le 15 tombe un samedi, la planification se décale au vendredi 14. S'il tombe un dimanche, elle se décale au lundi 16. La résolution ne franchit jamais les limites de mois : si le 1er est un samedi, 1W se résout au lundi 3, pas au vendredi précédent.

Combiner L et W

Quartz permet la combinaison LW, signifiant « le dernier jour ouvrable du mois ». C'est idéal pour les clôtures financières de fin de mois qui doivent s'exécuter un jour ouvré. Si le dernier jour est un samedi, LW se résout au vendredi. Notez que W ne peut pas être combiné avec une liste ou une plage — des expressions comme 1W,15W sont invalides.

Le caractère # : nième jour de la semaine du mois

# est valide uniquement dans le champ jour de la semaine et spécifie la Nième occurrence d'un jour de la semaine dans un mois. La syntaxe est jour#N, où jour est le numéro du jour de la semaine (1–7, dimanche au samedi) et N est l'occurrence (1–5).

Exemples pratiques

0 0 10 ? * 2#1 se déclenche à 10 h 00 le premier lundi de chaque mois. 0 0 14 ? * 6#3 se déclenche à 14 h 00 le troisième vendredi. Ces motifs remplacent les contournements fragiles qui reposent sur des plages de jour du mois et de la logique conditionnelle.

Quand N dépasse les occurrences réelles

Si vous spécifiez 2#5 (le cinquième lundi), la planification ne se déclenche pas dans les mois n'ayant que quatre lundis. Quartz traite cela comme une non-correspondance, pas une erreur — un saut silencieux qui rend la surveillance du nombre d'exécutions essentielle.

Le caractère # ne peut pas apparaître dans le jour du mois et ne peut pas être combiné avec des listes, des plages ou des incréments. Chaque champ jour de la semaine accepte au maximum une spécification #.

Comportement aux limites et modes de défaillance

Les erreurs subtiles avec ces caractères déclenchent rarement des erreurs de validation mais dévient silencieusement de l'intention.

Pièges courants

ExpressionAttenduRéelCorrection
0 0 9 L * 6Dernier jour si vendrediConflit : les deux champs jour sont définisUtilisez ? dans un champ jour
0 0 9 1W * ? (le 1er est samedi)Vendredi précédentLundi 3 (pas de franchissement de mois)Vérifiez avec l'aperçu des prochaines exécutions
0 0 9 ? * 2#5Cinquième lundi chaque moisUniquement les mois avec cinq lundisAjoutez une surveillance du nombre d'exécutions
0 0 9 LW * ? en févrierDernier jour ouvrable26, 27 ou 28 selon l'annéeVérifiez l'aperçu tenant compte du fuseau horaire

L'erreur la plus dangereuse est de spécifier des valeurs dans les deux champs jour du mois et jour de la semaine sans utiliser ? comme espace réservé. Quartz exige que exactement un champ jour contienne ?. L'omettre produit une erreur d'analyse ou un comportement indéfini selon la version de Quartz.

Cadre de décision : choisir le bon caractère

Chaque caractère spécial résout un problème de planification différent. Le choix du bon dépend de si votre planification est ancrée à une date calendaire, un jour de la semaine ou une position relative dans le mois.

BesoinCaractèreChampExemple
Exécuter le dernier jour de chaque moisLJour du mois0 0 18 L * ?
Exécuter N jours avant la fin du moisL-NJour du mois0 0 18 L-3 * ?
Exécuter le dernier jour de la semaine spécifiquenLJour de la semaine0 0 9 ? * 6L
Exécuter le jour ouvrable le plus proche d'une dateWJour du mois0 0 9 15W * ?
Exécuter le dernier jour ouvrable du moisLWJour du mois0 0 17 LW * ?
Exécuter le Nième jour de la semaine du mois#Jour de la semaine0 0 10 ? * 2#1

Quand votre besoin est purement basé sur la date (« le 15 »), vous n'avez pas du tout besoin de caractères spéciaux. Utilisez W uniquement quand l'alignement sur les jours ouvrés est requis. Utilisez # uniquement quand l'occurrence récurrente d'un jour de la semaine importe plus qu'une date fixe. Et utilisez L quand la sémantique de fin de mois doit s'adapter automatiquement aux longueurs de mois variables.

Renforcement pour la production : vérifications pré-déploiement

Avant qu'une planification Quartz n'atteigne la production, parcourez ces étapes de vérification pour détecter les cas limites que la validation statique ne peut pas révéler.

Liste de vérification

VérificationPourquoi c'est importantCritère de réussite
Analyse sans erreursConfirme la validité syntaxiqueAucune exception d'analyse
Inspecter les 10 prochaines exécutionsRévèle les surprises de limites de moisToutes les dates correspondent à l'intention
Vérifier l'alignement du fuseau horaireDécalages entre fuseau horaire serveur et métierLes exécutions correspondent au fuseau horaire cible
Confirmer le placement de ?Les deux champs jour actifs sont indéfinisUn champ jour contient ?
Vérifier les sauts silencieux#5 peut se déclencher < 12 fois/anNombre annuel documenté

L'aperçu des prochaines exécutions de Cronwise renvoie les 10 prochaines exécutions dans le fuseau horaire sélectionné, vous permettant de vérifier ces critères sans déployer de tâche de test. Si votre équipe opère dans plusieurs fuseaux horaires, consultez Les fuseaux horaires cron expliqués pour les équipes internationales pour des conseils supplémentaires.

Synthèse

Les caractères L, W et # de Quartz vous donnent une puissance de planification que le cron standard ne peut égaler. L s'adapte aux longueurs de mois variables, W aligne l'exécution sur les jours ouvrés et # ancre les exécutions à des occurrences spécifiques de jours de la semaine. Utilisés correctement, ils éliminent les contournements fragiles et rendent l'intention de planification explicite dans l'expression elle-même.

Les règles de décision clés sont simples. Utilisez L pour la logique de fin de mois. Utilisez W quand vous avez besoin du jour ouvrable le plus proche. Utilisez # pour le Nième jour de la semaine d'un mois. Placez toujours ? dans le champ jour que vous n'utilisez pas. Et vérifiez toujours avec un aperçu des prochaines exécutions avant de déployer.

Prêt à créer ou valider votre planification Quartz ? Ouvrez le générateur Quartz Cronwise pour construire des expressions visuellement, voir des explications en langage clair et prévisualiser les exécutions dans votre fuseau horaire cible. Pour plus de guides de planification cron et d'analyses approfondies, parcourez tous les articles cron sur Cronwise.