Pour faire des études sur le climat, la météo, l'histoire, la généalogie, ou pour comparer des performances d'une année à l'autre, planifier l'activité d'une entreprise ou d'une association, il est utile de gérer les dates sur des tableurs comme Microsoft Excel, LibreOffice Calc, Google Sheets.
Or il est très facile de manipuler les dates milésiennes avec les tableurs, grâce aux fonctions de conversion, en accès libre sur notre page de ressources.
A titre de démonstration, le kit de fonctions de conversion est fourni avec une feuille des dates remarquables en France: les fêtes civiles fixes et mobiles et les commémorations entrées dans les habitudes.
Ces fonctions ont la même structure que les fonctions standard de date proposées dans les tableurs. Elles permettent:
Dans la version Excel, nous fournissons également le calcul d'épacte et le calcul de la date de Pâques, qui permettent d'une part d'estimer la phase de lune, de trouver toutes les fêtes chrétiennes mobiles.
Explications et détails dans les rubriques ci-après. Aide détaillées sur chaque fonction à la page Aide tableurs. Téléchargement des applications via la page ressources, bouton infra.
La gestion des dates du calendrier proposée par le tableur Excel Microsoft présente des dysfonctionnements et des limites très gênantes si l'on veut gérer des dates anciennes, par exemple pour des études climatiques, généalogiques ou historiques.
En premier lieu, la saisie de dates entre le 1/1/1900 et le 29/02/1900 provoque l'enregistrement de dates ayant un jour d'écart avec la réalité. En effet l'année 1900 n'est pas bissextile, ce qui avait échappé aux ingénieurs logiciel concepteurs du premier Excel. Ce dysfonctionnement connu et abondamment commenté n'est pas corrigé, pour des raisons de "compatibilité". Tout utilisateur Excel doit admettre que le 1er janvier 1900 a dû être un dimanche; alors que les historiens (et les Milésiens) savent que c'est un lundi.
En second lieu, les anciennes feuilles Excel créées à l'origine sous MacOS ont comme origine le 1er janvier 1904. Mais le "Virtual Basic" gère un objet Date qui est toujours conforme à la norme Microsoft. Il en résulte une gymnastique un peu compliquée si l'on veut offrir un service valable aux tenants du monde Apple.
Excel propose un début de gestion des dates et heures antérieures au 20e siècle. On peut ainsi remonter au 1er janvier de l'an 100 en date grégorienne, soit le 3 janvier 100 en date historique du calendrier julien. Mais avec ces dates antérieures à 1900, les heures sont gérées de manière étrange, ce qui rend très délicate leur utilisation.
A l'heure actuelle personne ne s'en aperçoit parce que les dates et heures antérieures au 20e siècle ne peuvent être utilisées qu'avec Visual Basic. Si vous écrivez par exemple le 01/03/1900 06:00 dans une cellule, et que vous écriviez, dans la cellule voisine, de retirer 365 jours à la première cellule, vous obtenez une chaîne de dièses (####) qui remplit la cellule résultat. En modifiant le format de cette dernière cellule, vous voyez qu'elle porte un nombre décimal négatif. Ce nombre correspond au nombre de jours et à la fraction de jour précédant le 30 décembre 1899 à 0 heure, la vraie date 0 du système d'horodatage de Windows. Aucune fonction standard d'Excel ne permet d'afficher sous forme de date lisible une telle valeur, ni d'effectuer des calculs.
Sous Visual Basic, c'est-à-dire si vous rédigez des macros ou des fonctions personnelles, ces cellules non affichables sont des objets de type Date. La bonne nouvelle c'est que les expressions de dates (les chaînes de caractères représentant des dates) antérieures au 1er mars 1900 sont correctement interprétées: par exemple la chaîne "29 février 1900" est refusée, la chaîne "2 janvier 1900" est valorisée avec le nombre 2 et non 1, le jour de semaine correspondant est bien lundi, non pas dimanche.
Hélas ! Si par hasard une expression de date antérieure au 30 décembre 1899 comprend une indication d'heure, par exemple 2/12/1805 06:15, l'heure est comptabilisée en négatif dans le calcul de l'objet Date. De ce fait l'échelle des temps censée représenter les dates et heures est discontinue. Cela aboutit à des aberrations dignes d'Alice au pays des Merveilles, avec chaque jour à minuit un saut dans le futur de deux jours.
Peut-être est-ce pour cette raison que Microsoft masque les dates antérieures à 1900. Le même problème frappe d'autres bases de données de Microsoft, notamment celle utilisée par défaut avec Microsoft Access. Il est donc a priori impossible d'effectuer des calculs simples de durée sur la base de la représentation numérique de dates antérieures à 1900 des bases de données Microsoft.
Le module VBA de fonctions milésiennes mis gratuitement à disposition sur notre boutique permet de gérer les dates à partir du 1er janvier 100 (grégorien proleptique) en représentation milésienne. On peut faire des calculs de décalage de mois, de phase de lune, trouver le dimanche de Pâques (non disponible en standard sous Excel), le clavedi, l'épacte grégorienne ou milésienne, traiter les feuilles avec calendrier à origine 1904, et utiliser le jour julien. Les objets Date utilisés en paramètres ou en résultat des fonctions suivent la norme Microsoft. Deux fonctions permettent le calcul de durée entre deux dates, et de définir une date à un délai défini par rapport à une autre, y compris avec des dates antérieures à 1900.
Un analyseur d'expressions de dates grégoriennes ou milésiennes ("parseur") est également fourni. Vous pouvez ainsi convertir des expressions de dates écrites en grégorien ou milésien. Le résultat de cet analyseur est un objet Date conforme à la norme Microsoft Excel y compris pour les dates antérieures au 30 décembre 1899.
Ces modules sont immédiatement utilisables soit sous forme de "complément Excel", soit sous forme de module à insérer dans une "feuille avec macros".
Nous proposerons d'autres fonctions (calendrier julien, dates antérieures à l'année 100) s'il existe une demande suffisante.
Depuis au moins la version 6, LibreOffice Calc, le tableur de la suite Libre Office, gère des données de type Date à partir du 1er janvier de l'an 32767 avant J.-C. julien (7 5m -32767) et passe au grégorien le 15 octobre 1582 (25 10m 1582). On peut aller dans le futur jusque l'année grégorienne 32767. Pour saisir correctement les dates du premier siècle, il faut imposer un format de date avec une année à quatre chiffres. Si l'on tente de saisir par exemple le 14/10/1582, date qui n'a jamais existé à Rome, la date apparaît sous forme de texte (cadré à gauche par défaut) et aucune fonction de date ne lui est applicable.
On peut même indiquer l'heure UTC dans de telles expressions de dates, le numéro de jour comprend alors une partie décimale, qui représente le temps écoulé depuis 0h UTC.
Les fonctions ANNEE, MOIS et JOUR de LibreOffice Calc renvoient toujours un résultat selon le calendrier grégorien proleptique. Ces résultats ne correspondent donc pas à la date affichée quand la date est antérieure au 15 octobre 1582 (sauf pour les dates du 3e siècle).
La fonction DATE de LibreOffice, qui calcule une date à partir de l'année, du mois et du jour, renvoie une erreur si les paramètres de date sont antérieurs au 15 octobre 1582. Si l'année est un nombre à deux chiffres, elle est considérée du 20e ou du 21e siècle.
Les fonctions de dates milésiennes permettent de gérer directement et sans ambiguïté toutes les dates à partir du 7 5m -32767 (correspondant au 1er janvier 32767 av. J.-C. julien) jusqu'au 10 1m 32768 (31 décembre 32767 grégorien) . Les années milésiennes sont en convention relative, avec une année 0 et des nombres négatifs pour les années antérieures.
A noter que les concepteurs de LibreOffice Calc proposent quelques fonctions supplémentaires par rapport à Microsoft, notamment une fonction de calcul du dimanche de Pâques grégorien en fonction de l'année, pour toute année postérieure à 1582.
Le module de fonctions complémentaires que nous proposons peut soit être intégré dans une bibliothèque personnelle, soit être associé à des feuilles Calc spécifiques. Il permet la gestion de dates spécifiées en milésien, l'affichage de dates, le calcul sur les mois et les phases de lune, un calcul de semaine avec une option supplémentaire. Il comprend un analyseur d'expression de chaîne de caractères ("parseur") pour écrire directement une expression de date milésienne ou julio-grégorienne et la traduire en date. Cette fonction d'analyse de chaîne de caractères permet aussi de gérer des dates antérieures à l'ère chrétienne.
Le tableur Google Sheets permet, comme Excel et Libre Office, de créer des bibliothèques de fonctions spécifiques. Toutefois, au lieu d'utiliser un dialecte du langage Basic (Visual Basic avec Excel, Basic pour Libre Office), Google propose son langage Google Script, fondé sur Javascript. D'une part, alors qu'on adapte relativement facilement des fonctions pour Excel à un environnement Libre Office, il faut réécrire entièrement ces fonctions pour l'environnement Google Sheets. Enfin, Google a cherché à implémenter la notion des dates et heures locales dans la gestion de dates. Comme le dit pudiquement la documentation Google, cela créée des difficultés si l'on veut gérer les heures locales.
Les dates et heures des feuilles Google Sheets sont implémentées comme sur les autres tableurs, à l'aide d'un nombre décimal dont la partie entière représente le nombre de jours depuis l'origine Windows, le 30 décembre 1899 à minuit. Aucune notion de fuseau horaire ni d'heure d'été n'est proposée à l'utilisateur. La différence entre deux événements de part et d'autre d'un changement d'heure n'est aucunement impactée de la perte ou du gain d'une heure.
Quand l'on écrit un programme en Google Script, toute date de feuille Google Sheets est convertie en une donnée de type Date de Google Script, implémenté comme une date Posix: un nombre entier de millisecondes depuis le 1er janvier 1970 à 0h UTC. Lors de cette conversion, Google Sheets considère que la date origine est une date locale selon les paramètres de la machine de l'utilisateur. Il convertit cette date origine en utilisant les mêmes tables qu'Unicode. Par exemple si le fuseau horaire de référence de l'utilisateur est Paris, l'heure locale avant 1911 est réputée en avance de 9 mn 21 s sur l'heure UTC. Google Sheets convertit les dates locales en tenant compte des heures d'été éventuelles.
Via le langage Google Script, on n'accède pas à cet écart d'heure locale de 9 mn 21 s, mais seulement à l'heure du fuseau, que l'on distingue de l'heure UTC. L'heure du fuseau est éventuellement décalée les périodes où était mise en vigueur l'heure d'été. Mais il y a des différence entre la chronique des écarts horaires (y compris ceux dus à l'heure d'été) lors de la conversion d'une date Google Sheets en date Google Script, et l'écart horaire obtenu avec des opérations purement Google Script.
Ces choix rendent très hasardeuses les tentatives de gestion des dates locales avec Google Sheets et Google Script.
Par ailleurs, les dates Google Sheet sont représentées en calendrier grégorien proleptique uniquement, comme sous Excel. La date la plus ancienne autorisée est le 1er janvier -1 (grégorien), soit le 12 1m -1 (3 janvier 2 av. J.-C.), représentée (jj/mm/aaaa) par la chaîne 01/01/00-1. La date la plus avancée est le 31 décembre 99 999.
Si un calcul donne une date antérieure ou postérieure à ces valeurs, le compteur de tableur est affiché en tant que nombre.
Les fonctions milésiennes pour Google Sheets sont les mêmes que pour les autres tableurs. Ont été ajoutées: MILESIAN_UTCYEAR, MILESIAN_UTCMONTH, MILESIAN_UTCDAY, MILESIAN_UTCDISPLAY, qui restituent la date UTC ou ses éléments, ainsi que la fonction TIMEZONE_OFFSET, qui donne l'écart horaire entre le fuseau de l'utilisateur et UTC. En revanche, les fonctions lunaires MOON_PHASE_LAST et MOON_PHASE_NEXT ne sont pas implémentées, en raison de la difficulté à interpréter correctement la date et l'heure données. Enfin la fonction DATE_PARSE n'a pas été réécrite en Google Script.
Ces fonctions lèvent une exception si la date donnée ou calculée est en-dehors du domaine de définition de Google Sheets du 12 1m -1 au 31 12m 99999. Il n'y a pas de contrôle d'intervalle sur les calculs de jour julien.
Sur demande, nous pouvons traduire en Google Script les fonctions lunaires Javascript, ce qui permettrait, sous certaines réserves, d'obtenir les données lunaires à partir d'une date Google Sheets.