Problème de conversion de date

Signaler
Messages postés
75
Date d'inscription
samedi 26 juillet 2003
Statut
Membre
Dernière intervention
21 mai 2014
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour à tous,

Je tente d'obtenir le dernier jour du mois selon un mois et une année donnée et j'ai une petite erreur de conversion que je n'arrive pas à résoudre :

Ligne de code : DernierJourDuMois = CDate(Date.DaysInMonth(AnneeSelectionnee, MoisSelectionne) & "/" & MoisSelectionne & "/" & AnneeSelectionnee)

Erreur : La conversion de la chaîne "30/6/2013" en type 'Date' n'est pas valide.

Mes variables contenaient ceci :
AnneeSelectionnee = 2013
MoisSelectionne = 6



Merci d'avance à ceux qui prendront le temps de me lire et votre aide est très apprécié :)



Bonne journée !

23 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut

Mélanger des chaines et des nombres : jamais très bon.
Un peu de .ToString serait le bienvenu.
Il est possible que les n° de mois doivent être exprimés sur 2 digits (06 et non 6) pour répondre au format Date.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)

Bonjour,

Une petite fonction?
Option Explicit On
Option Strict On
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Dat As Date = CDate("15/02/2013")
        MsgBox(DernierJourDuMois(Dat))
    End Sub

    Private Function DernierJourDuMois(ByVal dtDate As DateTime) As DateTime
        Dim dtTo As New DateTime(dtDate.Year, dtDate.Month, 1)
        dtTo = dtTo.AddMonths(1)
        dtTo = dtTo.AddDays(-(dtTo.Day))
        Return dtTo
    End Function

End Class



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Bonjour,

Pour me donner un air de petit génie devant Jack et Acive, que je salue au passage; voici une petite passe, inspirée de l'aide de VB. Hé oui, de l'aide de VB.

Donc, si c'est vraiment du VB.net, juste à faire une petite passe avec DateTimeOffset.DayOfWeek [SIC]

Avec un DateTimePicker:

 Private Sub DateTimePicker1_ValueChanged(sender As Object, _  
                            e As EventArgs) Handles DateTimePicker1.ValueChanged
        Dim ladate As DateTimeOffset = DateTimePicker1.Value
        Dim lejour As String = ladate.ToString("dddd", _ 
                               New Globalization.CultureInfo("fr-fr"))
        MessageBox.Show(lejour)
 End Sub


À la mitaine:

Sub ÔProgrammeDisMoileJour()
        Dim ladate As DateTimeOffset = #6/30/2013#
        Dim lejour As String = ladate.ToString("dddd", _ 
                               New Globalization.CultureInfo("fr-fr"))
        MessageBox.Show(lejour)
    End Sub


Sans recourir à la chaîne de formatage et au CultureInfo, le 30 juin est un Sunday. Avec la chaîne de formatage et le CultureInfo, le 30 juin est un dimanche.

Bonjour Acive,

Pour commencer, une petite déception:

Dim Dat As Date = CDate("15/02/2013")


Ne fonctionne pas avec mon VB2012, même en ajoutant la référence à VisualBasic. "La conversion de la chaîne "15/02/2013" en type 'Date' n'est pas valide." qu'ils disent.

Mais, ceci étant dit je constate que nous n'avons pas interprété la question de la même façon. L'interprétation de l'expression "le dernier jour du mois" faisant divergence. Ton jour à toi est une date et mon jour à moi est un jour de la semaine. Je me suis dit, qu'en toute logique, n'importe quel humain normalement constitué n'a pas besoin d'un ordinateur pour savoir que le mois de juin a 30 jours. Mais, qu'il pouvait être intéressant de penser que de savoir à quel jour de la semaine pouvait correspondre "le dernier jour du mois".

Autre raison de réclamer des questions précisément précises.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour,
A acive ===>> et donc :

Dim dtTo As New DateTime(dtDate.Year, dtDate.Month + 1, 1)
dtTo = dtTo.AddDays(-1)

ou encore (mon petit doigt me dit que DateTime de VB.Net devrait réagir comme DateSerial de VB6) directement :

Dim dtTo As New DateTime(dtDate.Year, dtDate.Month + 1, 0)



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Et au fait :
Quid de l'utilisation toute bête d'une méthode VB.Net ===>W>
Celle-ci, par exemple


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
Bonjour à tous,

A Active : Attention si vous ajouter 1 mois au 1er du du mois, il ne faut retirer qu'un jour pour avoir le dernier jour du mois précédent.

A ucfoutu : Dim dtTo As New DateTime(dtDate.Year, dtDate.Month + 1, 1) ne marchera pas pour le "01/12/2013" car Month+1 donnera 13 donc exception il me semble.

Pour ma part, j'utilise :
Private Function DernierJour(ByVal mois As Integer, ByVal anneee As Integer) As DateTime
     Dim dtTo As New DateTime(anneee, mois, 1)
     Return dtTo.AddMonths(1).AddDays(-1)
End Function

Private Function DernierJour(ByVal vDate As DateTime) As DateTime
     Return DernierJour(vDate.Month, vDate.Year)
End Function

Bonjour tout le monde,

Franchement ce code n'est pas à moi...
J'ai jamais eu besoin de connaitre le dernier jour du mois, mais j'avoue que ça pourrait être pratique pour savoir si le jour de la paie approche.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
A foliv57
Je n'ai pas VB.Net pour tester, mais confirme-moi que ce que tu as dis est le résultat d'un test en réel.
Car si confirmation, cela voudrait dire que DateTime de VB.Net est moins puissante que DateSerial de VB6. *
(et j'ai des difficultés à le croire...).
Confirme, s'il te plait.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
Dim dtTo As New DateTime(2013, 12 + 1, 1)

ou
Dim dtTo As New DateTime(2013, 12 + 1, 0)

ou
Dim dtTo As New DateTime(2013, 12 , 0)

provoquent un "ArgumentOutOfRangeException" avec le détail "Les paramètres Year, Month et Day décrivent un DateTime qui ne peut pas être représenté."

Quel est le résultat de
DateSerial(2013, 13, 0)

En VB6 ? J'avoue que je n'ai jamais essayé.

Un exemple utilisant Dateserial:
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Dat As Date = CDate("15/02/2013")
        Me.Text = CStr(DernierJourDuMois(Dat))
    End Sub

    Function DernierJourDuMois(ByVal Dat As Date) As Date
        Return CDate(DateAdd("m", 1, DateSerial(Year(Dat), Month(Dat), 0)))
    End Function

End Class



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Une fonction avec DateTime:
 Private Function LastDayOfMonth(ByVal aDate As DateTime) As Date
        Return New DateTime(aDate.Year, aDate.Month, DateTime.DaysInMonth(aDate.Year, aDate.Month))
    End Function


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
A foliv57
Sous VB6, Dateserial ne se trompe pas et
DateSerial(2013, 13, 0)
retourne bien 31/12/2013

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
A cmarcotte

Dim Dat As Date = CDate("15/02/2013")

Ne fonctionne pas avec mon VB2012, même en ajoutant la référence à VisualBasic. "La conversion de la chaîne "15/02/2013" en type 'Date' n'est pas valide." qu'ils disent.


Cela doit venir des paramètres linguistiques de votre système.
S'il est en anglais il faudra écrire
Dim Dat As Date = CDate("02/15/2013")

Et pour être vraiment sur, le mieux c'est
Dim Dat As Date = Date.Parse("15/02/2013", CultureInfo.CreateSpecificCulture("fr-FR"))

Dans ce cas, la date est vraiment convertie par rapport à la culture passée en paramètre.

Et je rejoins Jack sur le fait de limiter le mélange chaînes/dates. C'est à coup sûr source d'erreurs.

En tout cas, avec tous ces exemples, Goth25 devrait trouver son bonheur.

Quel mobilisation pour une date de fin de mois...
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
DateSerial(2013, 13, 0)
retourne bien 31/12/2013

C'était plutôt cool cette technique en VB6. Dommage qu'ils n'aient pas eu envie de se casser la tête avec le constructeur de la classe "DateTime" en .Net
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
C'était plutôt cool cette technique en VB6. Dommage qu'ils n'aient pas eu envie de se casser la tête avec le constructeur de la classe "DateTime" en .Net

Ouais. Mais regarde (cela ne va pas faire plaisir aux puristes, mais ...)
Tapez le texte de l'url ici.
Vive la régression.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
Ils nous reste donc que deux possibilités.
1) Utiliser "Microsoft.VisualBasic.DateAndTime.DateSerial"
Dim maDate As Date = DateAndTime.DateSerial(2013, 13, 0)

2) Soit surcharger un constructeur de la classe "DateTime" qui reprend les fonctionnalités de "DateSerial"
...Euh pas ce soir...

Oui, mais on ne peux plus utiliser DateSerial si l'on désactive la référence Microsoft.VisualBasic.

Donc en .Net la solution plus logique ça restera:
 
Dim Dat As Date = CDate("15/02/2013")
MessageBox.Show(CStr(DateTime.DaysInMonth(Dat.Year, Dat.Month)))



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Bonjour,

En tout cas, avec tous ces exemples, Goth25 devrait trouver son bonheur.
Quel mobilisation pour une date de fin de mois...


En tout cas, j'ai hâte qu'il nous dise ce qu'il cherchait réellement : une date ou le jour de la semaine.

Pour ne pas se perdre dans les conversions, les dates en dates, nombres ou texte; rien ne vaut un bon DateTimePicker , un bon MonthCalendar ou la date au bon vieux haïssable format américain entre deux dièses.
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut
peut etre ainsi

Imports System.Globalization.GregorianCalendar
Imports System.Globalization

Private Function QuelleJour(ByVal year As Integer, ByVal month As Integer) As String
    Dim fr As New CultureInfo("")
    Dim dayname As String
    Dim dayinmonth As Integer
    Dim frenchdayname As String = String.Empty
    dayinmonth = fr.DateTimeFormat.Calendar.GetDaysInMonth(year, month)
    dayname = fr.DateTimeFormat.Calendar.GetDayOfWeek(Convert.ToDateTime(dayinmonth.ToString & "/" & month.ToString & "/" & year.ToString)).ToString
    Return frenchdayname
End Function