Gestion de la date et de l'heure

Il y a beaucoup de confusion parmi tous les utilisateurs, pas seulement les débutants, sur la façon d'utiliser correctement le type de données de date dans Gambas. Cette page essaiera de le clarifier.

 Les dates ne sont pas des chaînes

     Représentation interne

     Fonctions qui traitent de U.T.C. et format de date américain

     Fonctions qui traitent de l'heure locale

     Conversion implicite

 Les dates sont des nombres

 Dates nulles et dates de temps uniquement

 Stockage des dates

     Stockage des dates à l'intérieur d'un fichier binaire

     Stocker les dates à l'intérieur d'un fichier texte

 Dates et calendriers

Les dates ne sont pas des chaînes

La confusion provient principalement du fait que vous pensez aux dates en utilisant sa représentation de chaîne locale, c'est-à-dire comme si le type de données de date représenterait une date de paramètres régionaux. Grosse erreur! Représentation interne

En interne, Gambas stocke une valeur de date en utilisant deux entiers de 32 bits:

 Le premier entier est un certain nombre de jours depuis l'origine, un instant spécifique dans le passé. C'est la partie de la date. Chaque jour est censé être exactement 86 400 secondes, ce qui est une approximation.

 Le deuxième entier est un certain nombre de millisecondes ajoutés à ce nombre de jours. C'est la partie temporelle.

En d'autres termes, une valeur de date / heure gambas est un horodatage absolu.

Cette notion de temps absolu est un choix informatique pratique.

Il n'est pas important de savoir comment Gambas stocke en interne son type de données de date.

La chose importante que vous devez clairement mettre dans votre esprit: les dates des gambas ne sont pas des dates dans le sens habituel, mais des instants, c'est-à-dire des points dans le temps.

Mais il n'y a aucun moyen dans les gambas d'écrire directement une constante de date. Vous devez toujours utiliser la fonction de date qui construit une date ou convertir une représentation de chaîne de la date en utilisant CSTR, CDATE, STR $ ou VAL.

Par conséquent, chaque fois que vous manipulez une représentation de la date, Gambas doit décider si votre représentation de date est en U.T.C. ou à l'heure locale. En d'autres termes, le fuseau horaire associé à une représentation de date est implicite.

C'est un peu comme le problème des tarteaux de chaîne: le chargé d'une chaîne est implicite. Il n'est pas stocké avec la chaîne.

Les fonctions Gambas supposent soit qu'une représentation de date est:

 Dans U.T.C., en utilisant un format de date américain

 Dans le temps local, c'est-à-dire dans le fuseau horaire spécifié par la propriété System.TimeZone, qui provient directement de la configuration du système actuelle. Le format de date est le format de date local.

Le fuseau horaire dépend de ce qui est configuré dans votre système et lorsque vous convertissez la date en une chaîne (le fuseau horaire peut changer au cours de l'année ou en raison de décisions politiques soudaines). Le format de date dépend de la langue actuelle spécifiée par la propriété System.Language.

DePuis 3.18

Depuis Gambas 3.18, le fuseau horaire peut être explicitement spécifié dans une représentation de chaîne de date.

La syntaxe est:

hh

Voici la liste des fonctions liées à la date, et s'ils traitent avec U.T.C. ou l'heure locale. Fonctions qui traitent de U.T.C. et format de date américain CDATE convertit une expression en une valeur de date et d'heure. CSTR convertit une valeur de date et d'heure en une chaîne.

Ces fonctions sont utilisées par l'interpréteur lors de la conversion implicite du type de données. Fonctions qui traitent de l'heure locale La date renvoie une date sans son composant d'heure, ou créez une valeur de date et d'heure à partir de ses composants dans l'heure locale. DataEadd ajoute une période à une date donnée. Dadiff renvoie la période entre deux dates. Le jour renvoie le jour d'une valeur de date L'heure renvoie les heures d'une valeur de date. La minute renvoie les procès-verbaux d'une valeur de date. Le mois renvoie le mois d'une valeur de date. Le second renvoie les secondes d'une valeur de date. Str $ convertit une valeur de date et d'heure en une chaîne. L'heure renvoie la partie d'heure d'une valeur de date, ou créez une valeur de temps à partir de ses composants. Val convertit une chaîne en une valeur de date et d'heure, à condition que la chaîne représente une date au format de date et d'heure locale. La semaine renvoie le numéro de semaine d'une valeur de date. Le jour de la semaine revient le jour de la semaine d'une valeur de date. L'année renvoie l'année d'une valeur de date. Conversion implicite

Méfiez-vous avec une conversion implicite entre les dates et les chaînes!

 Imprimez une date à l'aide de la méthode STR $. La date est donc imprimée en heure locale.

 Toutes les autres conversions implicites utilisent les fonctions CSTR et CDATE, en supposant U.T.C. temps.

CSTR et CDATE ont l'intention d'être réciproque. Cela signifie que

CSTR (cdate (somestring)) = somestring

et

CDATE (CSTR (Somedate)) = Somedate

devrait toujours être vrai. Les dates sont des nombres

Une valeur de date et d'heure est implicitement convertie en un numéro de point flottant dont la partie entière est la partie de date interne (le nombre de jours depuis l'origine), et la partie fractionnaire est la partie du temps interne.

Par conséquent, vous pouvez facilement faire de l'arithmétique de jour entre les dates en utilisant les opérateurs standard + et -.

Pour le moment, l'instant d'origine est à minuit à l'heure UTC.

Par conséquent, si votre fuseau horaire n'est pas nul, cfloat (date (maintenant)) ne retournera pas un entier! Dates nulles et dates de temps uniquement

Les dates de temps uniquement sont la valeur de la date et de l'heure où la seule partie de la date

est zéro. Dans ce cas particulier, le fuseau horaire n'est pas pris en compte. Ceci est utile lorsque vous voulez faire de l'arithmétique avec les temps.

Les dates nuls sont des valeurs de date et d'heure lorsque les parties de date et d'heure sont égales à zéro. Ils sont équivalents à la constante nulle. Faire de l'arithmétique avec des dates nulles augmente une erreur. Stockage des dates

La seule façon de stocker les dates de manière fiable consiste à utiliser la représentation UTC. Ne stockez jamais une date dans la représentation locale! Ou du moins utilisez toujours la même fine. Stockage des dates à l'intérieur d'un fichier binaire

Vous devez utiliser les instructions d'écriture et de lecture avec la syntaxe AS.

De cette façon, vous rédigerez la représentation interne UTC de la valeur de date directement dans le fichier.

Méfiez-vous que la représentation interne peut changer, vous devez donc normalement ne pas supposer que la valeur binaire aura le même sens à l'avenir.

Mais si cette représentation interne change, la lecture et l'écriture seront modifiées pour être compatibles vers l'arrière, vous pouvez donc enfin supposer que la valeur binaire émise par la lecture restera la même. Stocker les dates à l'intérieur d'un fichier texte

Vous devez écrire et lire la représentation de chaîne UTC de la valeur de date, en utilisant les fonctions CSTR et CDATE.

Vous pouvez également utiliser CFLOAT sur la valeur de date pour stocker l'horodatage de la date interne comme valeur de point flottante. Cela fonctionne aussi, mais est moins lisible.

Sinon, vous pouvez utiliser n'importe quelle représentation personnalisée (horodatage UNIX par exemple), à condition qu'il s'agisse d'un changement constant par rapport au temps UTC absolu. Dates et calendriers

Pour le problème spécifique de la représentation de date uniquement, voir les dates et les calendriers.