Convertir date string où l'année est absente

smr78 Messages postés 25 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 28 août 2022 - 5 déc. 2011 à 19:09
smr78 Messages postés 25 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 28 août 2022 - 9 déc. 2011 à 21:18
Bonjour,
Avec Vb.Net 2010, comment faire pour convertir en date un string où parfois l'année est absente?!
J'ai fait les tests avec Cdate(string) ou Date.Parse(string), ça me donne un bon résultat si l'heure est manquante aussi mais ce n'est pas bon si l'année est manquante et heure présente. Exemples

avec "5 déc." ça donne la date 5/12/2011 00:00:00
mais avec "5 déc. 23:00", il y a un message d'erreur "date invalide".
J'ai essayé diverses options de Date.Parse et Date.ParseExact, ça n'améliore pas vu que le CultureInfo.CurrentCulture est bien en "fr" (pour le test)
En attendant de trouver une solution simple, je vais essayer de détecter les strings avec années manquantes.
C'est dommage d'en arriver là car le site Msoft précise bien pour la méthode Date.Parse
"Cette méthode tente d'analyser la totalité de s pour éviter la levée de FormatException. Elle ignore les données non reconnues, si possible, et utilise la date actuelle pour compléter les informations manquantes se rapportant au mois, au jour et à l'année"

C'est bien vrai quand il n'y a pas l'heure, mais pas si l'année manque avec heure présente!
Merci par avance

smr78

24 réponses

smr78 Messages postés 25 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 28 août 2022
5 déc. 2011 à 19:15
Oups, erreur de recopie :
avec Date.Parse("5 déc. 23:00") ça donne
#12/5/2011 5:23:00 AM# (la date est bonne mais l'heure est fausse
c'est avec "5 déc. 23:00:00" que ça génère une erreur

smr78
0
Utilisateur anonyme
6 déc. 2011 à 00:17
Salut smr,

Si tu as donc une date sans année, ça nous laisse imaginer que ce serait l'année en cours, non?

Et si tu fais :
Date.Parse("5 déc." & Today.Year & " 23:00")


Le problème c'est quand tu vas arriver au 31 décembre, tu vas sûrement avoir des erreurs.



CF2i - Guadeloupe
Ingénierie Informatique
0
smr78 Messages postés 25 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 28 août 2022
6 déc. 2011 à 18:53
Bonjour,
Merci pour avoir répondu.

J'ai oublié de dire que ce n'est pas moi qui génère les dates, elles sont renseignées par l'utilisateur de mon programme. Et je ne peux pas les forcer à écrire les dates sous un format standard et fixe car mon programme doit analyser la liste des dates rentrées et mettre en couleur les dates, si "aujourd'hui" correspond soit au jour, soit au mois, soit à l'année, soit à la date complète (y compris parfois date avec heure).

Tu as raison, lorsque l'année manque, elle est à remplacer par l'année en cours, VB est sensé le faire tout seul, mais ça ne marche pas à tous les coups. Pour utiliser la formule que tu donnes, il faut donc d'abord détecter que l'année est manquante...
A suivre
Cordialement


smr78
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
6 déc. 2011 à 19:00
Bonjour,
c'est bien évidemment par là, qu'il faut aborder le problème (contrôle de saisie ou dtPicker)
Sinon ===>> pire que le bug de l'an 2000


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
6 déc. 2011 à 23:05
Re:
Ucfoutu a raison un dtPicker c'est idéal.

Tu dis:
Et je ne peux pas les forcer à écrire les dates sous un format standard

Pourquoi pas?
Ou au moins tu inscris une année toi même.

Cordialement

CF2i - Guadeloupe
Ingénierie Informatique
0
smr78 Messages postés 25 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 28 août 2022
7 déc. 2011 à 10:38
Bonjour,
Humh, il faut que je vous en dise un peu plus sur mon merveilleux programme qui par exemple peut servir à rappeler les anniversaires ou commémoration ; là où ça se corse, c'est que le programme est fait pour que l'utilisateur puisse demander une "alarme" tous les 5 de chaque mois par exemple, ou bien tous les "5 mai" ou bien tous les 5 mai à 23:00 ou bien le plus facile : le 5 mai 2012 ou 5 mai 2012 à 23:00

J'ai déjà fait une version en VB6 et ça marche pour déclencher une alarme tous les 5 du mois ou tous les "5 mai" avec Cdate() et DateDiff()!

Est-ce assez clair pour expliquer que le programme ne peut donc pas imposer de saisir "5 mai 2012", ni contrôler que la date soit complète au moment de la saisie. Bien sûr on ne peut imposer de formatter "5 mai 2012" ou "5/05/2012" etc... mais pas de problème pour ça, VB sait très bien reconnaître les différents formats habituel.

Cordialement

smr78
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
7 déc. 2011 à 10:42
Je ne te comprends pas, là :
"au moment de la saisie" (comme tu dis) : s'agissant d'alarmes anniversaires, c'est LA DATE DE NAISSANCE, qu'il convient de saisir (et celle-là est parfaitement contrôlable au_ moment de la saisie) !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
7 déc. 2011 à 11:21
Oui, et d'ailleurs il nous la faut l'année de naissance (par exemple) comment vas-tu annoncer un anniversaire sans annoncer l'âge?

Joyeux anniversaire! quel âge il a? je ne sais pas je sais juste que c'est aujourd'hui...



CF2i - Guadeloupe
Ingénieri<e Informatique
0
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 55
7 déc. 2011 à 12:46
Salut

je n'ai pas trop compris
si je rentre le 5 mai 2012 à quelle heure
l'alarme va se déclencher ?
si tu as plusieurs anniversaire à la meme date ?

à propos
le mot alarme n'est pas tellement appproprié
pour annnoncer un annniversaire
c'est une musique/chanson qui est joué avec
une belle image ou la photo de la personne en
question
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
7 déc. 2011 à 13:08
ou la photo de la personne en
question

ou à défaut celle d'un beau gosse. Je peux proposer la mienne ?

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
smr78 Messages postés 25 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 28 août 2022
7 déc. 2011 à 19:13
Bonjour,
Ok, j'attends vos photos.

Euh, non, l'usage du programme n'est pas comme ça. Ce n'est pas fait que pour des anniversaires. C'est l'utilisateur seul qui sait ce qu'il veut "commémorer". On ne sait pas quelle est l'année de l'événement passé.

L'utilisateur veut seulement être averti quand telle "date" va arriver, soit exactement au moment de la date, soit un peu avant (on peut programmer un "préavis") à une "date" antérieure (c'est le même problème, la "date" de préavis peut être un jour, un jour + mois, ou jour + mois + heure).
Encore un exemple théorique, dans une entreprise ou une mairie, il y a des "échéances" où une certaine tâche périodique sera à faire : préparer le bilan de fin de mois, payer des taxes, préparer la fête du village, le pot d'adieu du patron.... je m'égare!

Il n'y a pas de date de début à ces tâches périodiques, on veut juste être averti à l'avance de la date où ça doit arriver.

Merci pour votre attention et vos réactions rapides.

Cordialement

smr78
0
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 55
7 déc. 2011 à 19:35
Bonsoir

Conclusion ce n'est si simple que ça
avec des rappels
ex rappel tout les x jours etc
en plus il faut effectuer beaucoup de test
pour voir si ça fonctionne
on fait plutot des test pour trouver les
bugs c.a.d prouver que l'application ne
fonctionne pas

Bonne prog
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
7 déc. 2011 à 19:56
Attends, là :
je n'ai pas la moindre idée , ni n'ai jamais entendu parler, ni n'ai jamais même imaginé ce que pourrait être la commémoration d'un évènement qui ne s'est pas produit. Et s'il s'est produit, il s'est précisément produit à une date précise (celle que l'on commémore !) ===>> et il n'y a absolument aucune différence entre l'anniversaire d'une date de naissance (hé oui ! la naissance est un évènement) et l'anniversaire d'un évènement !
Mission première : réfléchir un peu.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
smr78 Messages postés 25 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 28 août 2022
7 déc. 2011 à 21:09
Ok, il faut s'entendre sur le sens exact des mots ou sur leurs sens commun. C'est pour ça que j'ai mis certains mots entre guillemets.
Je ne cherche pas à calculer l'ancienneté d'un événement, par exemple l'âge si c'est un anniversaire. S'il s'agit d'une commémoration, par exemple le 6 juin 1944, dans l'usage de mon programme il ne s'agit pas de savoir il y a combien de temps cela s'est passé. Le but est simplement de se préparer à fêter la prochaine commémoration, soit le 6 juin 2012.
L'utilisateur a donc seulement besoin d'indiquer "6 juin" comme date de "déclenchement" de ce que vous voulez ("sirène", "alarme", "voyant"...) et chaque année le 6 juin, le programme préviendra.
Mais si un autre utilisateur ou le même, veut être averti à l'avance de la date des élections présidentielles, il écrira "mai 2012" et "x mai 2012" lorsque l'on connaîtra le jour.
(NB je prends ces exemples au hasard, toute ressemblance avec...)
C'est vrai que le tests des rappels est difficile, j'ai fait ça en VB6, avec plusieurs options de période, avant, et après la date d'événement.

Je me suis cassé la tête un bon moment en VB6 pour détecter si l'année ou le mois ou l'heure manquait, suivant différents formats jusqu'à ce que je rende compte que CDate faisait ça tout seul.

Cordialement



smr78
0
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 55
7 déc. 2011 à 22:03
tu dois avec les données rentrées par l'utilisateur crée un format de date correct
maintenant comment on introduit les données
j'écris dans un textbox 23/12 16:00
ou je clique sur un calendrier comme le datetimepicker pour la date et pour l'heure
un combobox

je ferais un combo pour les jours de 1 à 31
et un combo pour les mois de jan à dec
et combo pour l'année facultatif
un combo pour l'heure de 00 à 23 et un combo
pour les minutes de 00 à 59
et un bouton pour valider

comme ça tu es sur d'obtenir une date correcte
en formant la date avec les donnés des combo
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
7 déc. 2011 à 22:06
ou alors on ne parle plus de date et on n'utilise que des champs texte (un pour le jour, l'autre pour le mois) !
Mais qui te parle de calcul d'ancienneté ? On ne parle que d'anniversaire d'une date !
Allez ! fais comme tu l'entends, car là ... désolé.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
7 déc. 2011 à 22:14
et pour que tu prennes bien conscience de l'aspect plus que saugrenu de ta "démarche incertaine" : +++>>
imagine simplement une date anniversaire d'un 29 février (sans précision d'année) !
Tu vas tout droit vers du n'importe quoi !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
smr78 Messages postés 25 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 28 août 2022
7 déc. 2011 à 23:40
Merci pour ces remarques judicieuses.

Comme le dit ShayW, c'est exactement ce que j'ai fait pour indiquer les moments de rappels répétitifs qui surviennent entre la date de préavis et la date de l'événement en question, et après l'événement, des fois que l'utilisateur n'ait pas remarqué les alarmes ou n'ait pas allumé son ordinateur le jour du préavis ou le jour J, c'est à dire un combo pour choisir entre "rappel mensuel, hebdomadaire, jour, heure" comme cela pas d'erreur de saisie.
Si la date d'événement est un 29 février, l'utilisateur écrit "29 février" (et ça fonctionne s'il n'y a pas d'heure en Vb 2010) et l'alarme sera donnée si le 29 février existe. Humh, si c'est un anniversaire, la personne ne pourra pas fêter son anniversaire le 29 février si ce jour là n'existe pas, je suppose qu'elle le fêtera le 1er mars n'est-il pas? Si on veut absolument une alarme, on peut en programmer 3, une le 28 février, une le 29 et une le 1er mars?
Mais précisément, l'erreur arrive si on met un combo avec année facultative et combo heure affiché si pas d'année choisie. Ca me donne une idée pour la solution, inhiber les combo heure, minute si l'année n'est pas remplie, ou dans ma solution, effacer l'heure entrée dans un textbox si l'année n'est pas saisie.
Bon, cela ne me dit pas pourquoi en VB 2010, Cdate arrive à mettre l'année en cours si pas d'année et pas d'heure et se plante si l'heure est saisie. Après re-re tests, il me semble avoir des résultats variables : des fois ça donne 1er janvier 01 comme date, et des fois #12/5/2011 5:23:00 AM# par exemple pour "5 déc. 23:00"

Cordialement

smr78
0
Utilisateur anonyme
7 déc. 2011 à 23:52
Oui déjà si tu veux le programmer à l'avance, c'est pour te laisser le temps de lui acheter un cadeau.
Déjà oublie le gâteau comme cadeau, puisque il faut acheter les bougies qui vont avec, et combien de bougies vas-tu en acheter?

Moi ça me ferait marrer qu'on m'achète 21 bougies...
Après tu peux toujours sortir le coup de la promotion sur les bougies, mais bon...






CF2i - Guadeloupe
Ingénierie Informatique
0
smr78 Messages postés 25 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 28 août 2022
8 déc. 2011 à 14:01
Ah, en ce qui me concerne j'espère bien avoir mes 68 bougies lors de mon prochain anniversaire!
Est-ce que quelqu'un pourrait faire ce test simple dans VB6 puis dans VB.Net (j'utilise VB 2010 express) :
- VB6 :
? CDate ("5 mai 23:30")
chez-moi ça donne : 05/05/2011 23:30:00

- VB 2010 :
? CDate ("5 mai 23:30").ToString
ça donne : "01/01/0001 05:23:00"
idem si je tape
? CDate ("may/5 23:30").ToString
ça donne : "01/01/0001 05:23:00"

Est-ce donc que VB 2010 est plus strict ou dérive par rapport à VB6?
Est-ce qu'une autre version de VB.Net est compatible VB6?

Merci par avance.
Cordialement

smr78
0