Fonctions sur les dates

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fonctions sur les dates

Message par Ar-S »

Content qu'au final tout passe bien :D
Du coup ma liste de jour est squizée
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Fonctions sur les dates

Message par kernadec »

bonjour Ar-s
squizée... 8O pas compris dérision peut être :D... non j'ai gardé ta liste de jours.
mais, je n'avais pas vu immédiatement que tu avais remplacé les paramètres "Y,M,D etc.."
avec une fonction Date(), quand j'ai repris mes esprit avec la suites d'erreurs..
cela ma fait prendre conscience que le prototypes ne prenait pas en compte les paramètres.
alors, voilà pourquoi j'en suis arrivé à CallFunction()

@Ar-s : Pour revenir à ta liste lol.... J'avais oublié que DayOfWeek() était une fonction PureBasic... :oops:
En fait le problème venait d'un conflit de nom avec la procédure "DayOfWeek(Y,M,D,Gregorian)" de Calendar.dll.
L' erreur que le compilateur détectait en premier était dans les paramètres, le conflit de nom n'était pas détecté,
Et aussi que le paramètre d'adresse (@) avec un prototype n'est pas accepté.

Cordialement
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Fonctions sur les dates

Message par pat »

Bonjour,

A beruska :

Je crois que notre calendrier est Grégorien et non Julien (le calendrier Julien va jusqu'en 1582 inclus).
Ma ça c'est pas important.
L'algorithme des jours Julien que tu donnes manque de précision car je connais cet algorithme que j'ai pris dans un vieux livre des années 80 quand les ordinateurs étaient vraiment lents et avec peu de capacités mémoire.
Pour vérifier la chose, calcule l'écart de la date, par exemple, du 01/01/1600 au 31/12/3000 inclus et tu verras que ton algorithme donnera un nombre de jours inexact. Cela marche pour des périodes assez courte mais pas pour des périodes importantes.
Pour vérifier, utilise le tableur Excell (ou autre) avec le calcul des dates.
beruska
Messages : 21
Inscription : sam. 28/mai/2011 12:32

Re: Fonctions sur les dates

Message par beruska »

Pour Pat
Merci d'être intervenu dans ce débat sur les dates.
Nous sommes bien dans le calendrier grégorien; mais j'ai parlé de jour julien (il faudrait dire plus exactement julian date). C'est un instrument de travail utilisé en astronomie qui permet d'avoir un seul numéro pour chaque jour de l'histoire en partant de 4713 AC et allant jusqu'en 10000 DC. Pour faire des différence entre dates il n'y a rien de plus commode.
J'ai fait des vérifications sur Excel 2007; ce n'est absolument pas fiable pour les dates.
Essaie de voir combien de jours il y a dans une année, du premier janvier au premier janvier de l'année suivante: du 01/01/2001 au 01/01/2012, tu trouves 365 jours. Parfait.
L'an 2000 qui était bissextile: du 01/01/2000 au 01/01/2001: 366 jours. OK
Pour 1900 qui n'était pas bissextile: du 01/01/1900 au 01/01/1901: 366 jours !!!!
de même pour 2100, 2200, 2300 qui ne sont pas bissextiles! C'est beau?!
Et Excel traite le dates à partir de janvier 1900 seulement...

Exemple proposé: julian date du 01/01/1600 = 2305447,50
julian date du 31/12/3000 = 2817151,50
différence = 511704 jours...
(en parfaite concordance avec le prg d'astronomie RedShift 6).
A+
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Fonctions sur les dates

Message par pat »

A beruska.
Comme je ne suis pas chez moi, je vais aller vérifier tout ça mais à priori je te fais confiance.
A noter que les nouvelles versions d'Excell les dates peuvent aller nettement avant 1900.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Fonctions sur les dates

Message par pat »

A beruska.
J'ai regardé ton programme de près.
J'ai constaté que ce que j'avais vu dans un livre des années 80 n'était pas tout à fait à pareil à ton logarithme, même si cela y ressemblait fort, c'est pourquoi j'ai cru au même logarithme.
Ton programme permet, à partir d'une date, de connaître le jour de la semaine et aussi d'avoir un numéro de série.
Ton programme donne un numéro de série avec des décimales, ce qui n'est pas le cas sur Excell ou sur OpenOffice qui donne un numéro de série avec des entiers.
On peut donc, avec ton programme, également connaître l'écart entre deux dates, il suffit de soustraire les 2 numéros de séries.
Mais comme il y a des décimales, bien évidemment le résultat donne parfois aussi des décimales et on ne sait pas s'il faut arrondir au plus près ou tronquer la décimale. Mais je crois que ton programme fonctionne correctement.
Exemple :
Je veux connaître l'écart de jours entre le 06/07/2011 et le 06/07/3000. Soit 361225 jours exactement.
Numéro de série du 06/07/2011 : 2455744,5.
Numéro de série du 06/07/3000 : 2816969.5.
Le résultat donne 361225.5 donc je suppose qu'il faut tronquer la décimale.
Merci de me confirmer s'il en est ainsi.

Pour être complet il me faudrait connaître maintenant une opération que ton programme ne fournit pas mais qui peut être utile pour le calcul sur les dates. Je veux parler de connaître une date par son numéro de série (donc l'inverse de ton programme).
Cela peut servir, par exemple, pour ajouter ou soustraire des jours d'une date donnée.
Exemple :
Pour la date du 06/07/2011 (donc je connais le numéro de série) je souhaite ajouter 5 jours et connaître la nouvelle date ainsi donnée.
Mon programme devrait trouver le 11/07/2011.
Voilà à quoi cela peut servir.
Sauras-tu m'indiquer le logarithme qui m'indiqueras donc à partir du numéro de série la date qui y correspond ?
Ton programme est très intéressant mais il me manque ce dernier logarithme pour que cela soit complet et comme le numéro de série contient des décimales il n'est pas facile de trouver, sans savoir comment faire, le résultat.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Fonctions sur les dates

Message par graph100 »

pat a écrit :logarithme
: C'est "Algorithme" le mot juste
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Bernard
Messages : 23
Inscription : jeu. 22/janv./2004 8:56
Localisation : Le MANS (72)

Re: Fonctions sur les dates

Message par Bernard »

Bonjour,

Moi je cherche une fonction pour transposer le résultat d'une requête SQLite d'un champ DateTime qui me retourne :
40727.5195486111 pour une date 03/07/2011 12:28:09

Si quelqu'un a une idée cela me dépannerait

Merci
Bernard
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Fonctions sur les dates

Message par kernadec »

salut Bernard
J'ai pas vraiment fait le calcul pointu... mais quand on prend "40727/365" on trouve 111 ans.. ( 2011-111=1900 )
donc ton calendrier se base sur une référence de calcul depuis le 1/1/1900
tu peux prendre un autre système base depuis 1752 fin du julien Anglo-saxon comme point de départ,
tu les rattachent entre eux avec cette date commune du 1/ 1/ 1900

Cordialement
Bernard
Messages : 23
Inscription : jeu. 22/janv./2004 8:56
Localisation : Le MANS (72)

Re: Fonctions sur les dates

Message par Bernard »

Salut Kernadec,

J'ai réussi à résoudre le problème des jours en appliquant le calcul suivant :

Code : Tout sélectionner

        An.i = Val(Left(Annee,FindString(Annee,".",1)))-25569
        Debug FormatDate("%dd/%mm/%yyyy",AddDate(Date(1970,1,1,0,0,0),#PB_Date_Day,an))
Je prends les nombres à gauche du point, je retranche 25569 ce qui doit correspondre au nombre de jours entre 1900 et 1970.

Cependant je cherche toujours la solution pour les hh:mm:ss

Je veux bien de l'aide sur ce coup.

Cordialement
Bernard
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Fonctions sur les dates

Message par kernadec »

bonjour Bernard
pour les problèmes de temps, je pense que ce lien va te convenir.
http://www.purebasic.fr/german/viewtopi ... =8&t=22778

Cordialement
beruska
Messages : 21
Inscription : sam. 28/mai/2011 12:32

Re: Fonctions sur les dates

Message par beruska »

pat a écrit :A beruska.
J'ai regardé ton programme de près.
J'ai constaté que ce que j'avais vu dans un livre des années 80 n'était pas tout à fait à pareil à ton logarithme, même si cela y ressemblait fort, c'est pourquoi j'ai cru au même logarithme.
Ton programme permet, à partir d'une date, de connaître le jour de la semaine et aussi d'avoir un numéro de série.
Ton programme donne un numéro de série avec des décimales, ce qui n'est pas le cas sur Excell ou sur OpenOffice qui donne un numéro de série avec des entiers.
On peut donc, avec ton programme, également connaître l'écart entre deux dates, il suffit de soustraire les 2 numéros de séries.
Mais comme il y a des décimales, bien évidemment le résultat donne parfois aussi des décimales et on ne sait pas s'il faut arrondir au plus près ou tronquer la décimale. Mais je crois que ton programme fonctionne correctement.
Exemple :
Je veux connaître l'écart de jours entre le 06/07/2011 et le 06/07/3000. Soit 361225 jours exactement.
Numéro de série du 06/07/2011 : 2455744,5.
Numéro de série du 06/07/3000 : 2816969.5.
Le résultat donne 361225.5 donc je suppose qu'il faut tronquer la décimale.
Merci de me confirmer s'il en est ainsi.

Pour être complet il me faudrait connaître maintenant une opération que ton programme ne fournit pas mais qui peut être utile pour le calcul sur les dates. Je veux parler de connaître une date par son numéro de série (donc l'inverse de ton programme).
Cela peut servir, par exemple, pour ajouter ou soustraire des jours d'une date donnée.
Exemple :
Pour la date du 06/07/2011 (donc je connais le numéro de série) je souhaite ajouter 5 jours et connaître la nouvelle date ainsi donnée.
Mon programme devrait trouver le 11/07/2011.
Voilà à quoi cela peut servir.
Sauras-tu m'indiquer le logarithme qui m'indiqueras donc à partir du numéro de série la date qui y correspond ?
Ton programme est très intéressant mais il me manque ce dernier logarithme pour que cela soit complet et comme le numéro de série contient des décimales il n'est pas facile de trouver, sans savoir comment faire, le résultat.
Voilà la réponse à ta question; j'ai dû attendre la fin de mes vacances pour pouvoir faire toutes les vérifications nécessaires. C'est fait. J'ai laissé le .50 à la fin des numéros parce qu'habituellement on peut aussi décrire l'heure, les minutes e les secondes du jour. Bien sûr j'ai laissé tomber cet aspect. Bon courage.

Code : Tout sélectionner

; Retrouver la date qui correspond au numéro du jour julien
; Insérer par exemple 2455770.5 et on trouve le 28 juillet 2011
; Possibilité de voir une série de 50 jours en mettant les deux premières lignes en commentaire
; et en activant une des deux boucles For... Next... lignes suivantes
; PB 4.51 by beruska

a$ = InputRequester("", "Insérer jour julien","")  ; insérer le jour sous la forme xxxxxxx.50
JJ.f = ValF(a$)

; For x = 1  To 50                ; premier exemple à cheval sul les deux calendriers
;   JJ.f = 2299150.5 + x

; For x = 1 To 50                 ; deuxième exemple pour une année bissextile
;   JJ.f = 2451580.5 + x
  
    z = JJ + 0.5                            ; début de l'algorithme
    cod = Int((z - 1867216.25)/36524.25)
    a = z + 1 + cod - Int(cod/4)
    If z < 2299161                            ; pour les jours avant le 15 octobre 1582
      w = z
    Else
      w = a                                   ; pour le calendrier grégorien
    EndIf
    b = w + 1524
    c = Int((b - 122.1)/365.25)
    d = Int(365.25 * c)
    e = Int((b-d)/30.6001)                  ; fin del l'algorithme
    
    
      jour = b - d - Int(30.6001 * e)       ; recherche du jour
      
    If e < 13.5                             ; recherche du mois
      mois = e - 1
    Else
      mois = e - 13
    EndIf
    
    If mois >= 2.5                          ; recherche de l'année
      annee = c - 4716
    Else
      annee = c - 4715
    EndIf
    
    Debug StrF(JJ,2) + " - " + Str(jour) + "-" + Str(mois) + "-" + Str(annee) ; le résultat

; Next
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Fonctions sur les dates

Message par pat »

Un grand merci à toi beruska.
Je pense que je ne serais pas le seul à apprécier ton code.
Maintenant tout est complet au niveau des dates et beaucoup s'y inspireront et grâce à toi.
Et en plus cela ne prend pas beaucoup de place.
Un super merci.
8)
beruska
Messages : 21
Inscription : sam. 28/mai/2011 12:32

Re: Fonctions sur les dates

Message par beruska »

pat a écrit :Un grand merci à toi beruska.
Je pense que je ne serais pas le seul à apprécier ton code.
Maintenant tout est complet au niveau des dates et beaucoup s'y inspireront et grâce à toi.
Et en plus cela ne prend pas beaucoup de place.
Un super merci.
8)
Je me suis amusé à faire les deux procédures date-->jour julien, et jour julien-->date
avec un petit exemple... Merci!

Code : Tout sélectionner

; Exemple de calcul sur les dates avec l'emploi des jours juliens    -   by beruska
; NOTA: les dates doivent toujours figurer en format JJ MM AAAA avec espaces ou séparateurs.

Global jj.f
Global jour, mois, annee

; ------------------------------------
; D'UNE DATE QUELCONQUE AU JOUR JULIEN
; ------------------------------------

Procedure Julien(d$)    
  
  j = Val(Left(d$,2))    ; j = valeur numérique du jour 
  m = Val(Mid(d$,4,2))   ; m = valeur numérique du mois
  y = Val(Right(d$,4))   ; y = valeur numérique de l'année
  
    A0.f = y + m/100 + j/10000                    ; préparation de la date 15/10/1582
    A0 = Int(A0*10000+0.5)/10000                  ; sous la forme 1582.1015

  If m < 3               ; le calcul commence toujours au 1er mars; janvier et février figurent
    m+12                 ; comme le 13è et 14è mois de l'année précédente
    y-1
  EndIf
  
  If A0 > 1582.1004 And A0 < 1582.1015            ; le lendemain du 04/10/1582 est le 15/10/1582
  MessageRequester("Error", "Date inexistante")   ; donc éliminons les dates inexistantes (du 5 au 14)
  Goto iniz                                       ; on recommence
  EndIf
  
  a = Int(y/100)
  If A0 < 1582.1015 
  b = 0                                           ; pour les dates du calendrier julien
  Else
  b = 2-a+Int(a/4)                               ; pour les dates du calendrier grégorien
  EndIf
  c = Int(365.25 * y)
  d = Int(30.6001 * (m+1))
  
  jj.f = b + c + d + j + 1720994.5                ; jj est le jour julien de la date choisie
  
  ProcedureReturn
EndProcedure

; ---------------------------------------
; DU JOUR JULIEN A LA DATE CORRESPONDANTE
; ---------------------------------------

Procedure Conversion(a$)
JJ.f = ValF(a$)

    z = JJ + 0.5                            ; début de l'algorithme
    cod = Int((z - 1867216.25)/36524.25)
    a = z + 1 + cod - Int(cod/4)
    If z < 2299161                            ; pour les jours avant le 15 octobre 1582
      w = z
    Else
      w = a                                   ; pour le calendrier grégorien
    EndIf
    b = w + 1524
    c = Int((b - 122.1)/365.25)
    d = Int(365.25 * c)
    e = Int((b-d)/30.6001)                  ; fin del l'algorithme
    
    
      jour = b - d - Int(30.6001 * e)       ; recherche du jour
      
    If e < 13.5                             ; recherche du mois
      mois = e - 1
    Else
      mois = e - 13
    EndIf
    
    If mois >= 2.5                          ; recherche de l'année
      annee = c - 4716
    Else
      annee = c - 4715
    EndIf
    ProcedureReturn   
EndProcedure

; -------------------------------
; UTILISATION DES DEUX PROCEDURES
; -------------------------------
                                    ; Insérer sa propre date de naissance
                                    ; Ajouter un nombre de jours (10000, 20000 par exemple)
iniz:

datechoisie$ = InputRequester("", "Date de naissance? [gg mm aaaa]","")  
  Julien(datechoisie$)
  p.f = jj                 ; mémorise le résultat du jour julien

variation.l = Val(InputRequester("", "variation? nombre de jours",""))
p + variation
p$ = StrF(p,2)

  Conversion(p$)
  MessageRequester("","je suis né le " + datechoisie$ + Chr(13) + "j'aurai " + Str(variation) + " jours le " + Str(jour) + "-" + Str(mois) + "-" + Str(annee))
End
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Fonctions sur les dates

Message par pat »

A beruska.
Merci pour cette nouvelle contribution.
Au niveau des dates, cela va faire des heureux.
Répondre