Posts made by Joseph Rézeau

Picture of Développeurs Picture of Développeurs de plugins Picture of Moodleurs particulièrement utiles Picture of Testeurs Picture of Traducteurs

@Christian,

Oui, je sais tout ça... Et ça ne répond pas à mon problème... que j'ai finalement résolu par un petit bidouillage.

  1. Dans l'interface d'édition du contenu H5P (fichier semantics.json) au champ (texte) de saisie de la date j'ai rajouté cette expression régulière qui permet de cadrer la saisie :
  2. "regexp": {"pattern": "^(-\\d{4,}|\\d{1,}(-(1[012]|[0]?[1-9])(-([12][0-9]|3[01]|[0]?[1-9]))?)?)$"}
  3. avec cette description: "description": "Pattern: YYYY-MM-DD Only year is required. Years can be negative but year must consist of a minimum of 4 figures (and months and days are not accepted). e.g. -40000, -0045, etc."
  4. Dans le script qui récupère les données saisies en mode édition, je détecte la présence d'un signe négatif au début de la date; je rajoute un mois et un jour fictifs (1 1, soit le 1er janvier, juste pour que le Date.parse soit content, etc. ce qui donne ce code:
const isNegativeYear = dateString.startsWith("-");
var dateMillis = 0;
  if (isNegativeYear) {
    var negDateString = '1 1 ' + dateString;
    dateMillis = Date.parse(negDateString);
  } else {  
    dateMillis = Date.parse(dateString);
  }
Et dans dateMillis je récupère une chaîne contenant le Unix timestamp (millisecondes depuis 01-01-1970), positif si date postérieure au 1er janvier 1970 et négatif si antérieure à cette date... y compris des dates BCE (avant J.-C.). CQFD.
Je peux remonter jusqu'à 271820 BCE... ce qui me suffit largement !

PS.- Pour l'anecdote j'ai soumis mon petit bout de script à ChatGPT qui m'a gentiment et fort pertinemment répondu ceci :

Yes, this script should work as intended.

The script first checks if the dateString starts with a - character to determine if it represents a negative year. If it does, it creates a new string by adding '1 1 ' to the beginning of the dateString, which will create a valid date string that can be parsed by the Date.parse() method.

If dateString does not start with a - character, the script simply passes it to the Date.parse() method.

The Date.parse() method returns the number of milliseconds since January 1, 1970, 00:00:00 UTC for the given date string. The script stores this value in the dateMillis variable.

One thing to note is that the var keyword is used to declare the negDateString, dateMillis, and isNegativeYear variables. In modern JavaScript, it's recommended to use let or const instead of var to declare variables. Additionally, it's worth noting that the Date.parse() method may not be the best choice for parsing date strings in all cases, as it has some quirks and limitations.


Average of ratings: Utile (1)
Picture of Développeurs Picture of Développeurs de plugins Picture of Moodleurs particulièrement utiles Picture of Testeurs Picture of Traducteurs

Merci Christian,

Curieusement en effet, ça marche si on donne une date complète, avec mois et jour an plus de l'année négative ! Mais pour des dates aussi éloignées dans le temps (et approximatives) que la grotte de Lascaux (environ 13 000 avant J.-C.), voir s'afficher

January 1, 13000 BCE au lieu de 13000 BCE c'est plutôt ridicule.

Il va falloir que je creuse encore la question, mais merci de m'avoir donné une piste (tu es meilleur que ChatGPT 😎).

Picture of Développeurs Picture of Développeurs de plugins Picture of Moodleurs particulièrement utiles Picture of Testeurs Picture of Traducteurs

Cette demande s'adresse aux spécialistes du JavaScript. C'est indirectement lié à Moodle et plus directement lié à une bibliothèque H5P non-standard que j'essaie de customiser 'à la papi Jo'.

Il s'agit d'afficher une frise historique comportant des dates de type avant J.-C. (BCE). A un certain endroit d'un script, les dates doivent être converties en Unix timestamp (millisecondes depuis 01-01-1970). On utilise pour ça la méthode JavaScript Date.parse(), qui fonctionne OK pour des dates positives (à partir de l'an zéro). En revanche, si on y met une date négative (par exemple -2000 pour 2000 avant J.-C., ou 2000 BCE), la méthode Date.parse("-2000") renvoie une erreur : NaN (Not available Number). Vous pouvez le tester sur le site W3Schools ici.

Donc je suis coincé. En désespoir de cause j'ai posé la question à ChatGPT qui m'a répondu que ce que je voulais était tout à fait possible. Voici sa réponse :

papi Jo.- is this script correct? const t = Date.parse("-2000");
ChatGPT.- Yes, the script is correct.
The Date.parse() method takes a date string as an argument and returns the number of milliseconds since January 1, 1970, 00:00:00 UTC, also known as the Unix timestamp.
In this case, the date string "-2000" represents January 1, 2000 BCE (Before Common Era), and the Date.parse() method will return the Unix timestamp for that date, which is -62167392000000 milliseconds.
The const keyword is used to declare a constant variable t that will hold the value returned by the Date.parse() method. Since t is a constant variable, its value cannot be changed later in the code.
 So, the script will successfully parse the date string "-2000" and store the Unix timestamp for January 1, 2000 BCE, in the t variable.

EDIT.- En fait ChatGPT se trompe, puisque le Unix stamp qu'il indique pour l'année -2000 correspond en fait à l'année zéro 0000

Alors, qui a raison ? Existe-t-il une autre méthode JS permettant d'obtenir le résultat attendu ? Quelqu'un le sait-il ?

Merci d'avance aux geeks!

PS.- Sinon, j'ai sous le coude une solution de bidouillage, mais pas très propre...

Average of ratings: -
Picture of Core developers Picture of Particularly helpful Moodlers Picture of Plugin developers Picture of Testers Picture of Translators

Hello Valentin,

This issue has been reported on the Questionnaire github at https://github.com/PoetOS/moodle-mod_questionnaire/issues/420 and it's reported as having been fixed.

Try to update to Questionnaire version 4.0.0 (Build - 2023030700) 2022092201