none
Comment calculer la durée entre deux dates ?

    Question

  • Bonjour,

    j'ai besoin du code de calcul la période ou la durée entre deux dates

    la date 1 = DateTimePicker1

    la date 2 = DateTimePicker2

    la résultat :

    mois = TextBox_MOIS

    jours = TextBox_JOURS

    et Merci ...

    Tuesday, April 10, 2012 1:43 PM

Answers

  • A bon, vous êtes comme ça vous !!

    Dans ce cas là essayer le code suivant :

            Dim period = Me.DateTimePicker2.Value - Me.DateTimePicker1.Value
            Dim monthsDiff = 12 * (Me.DateTimePicker2.Value.AddDays(1).Year - Me.DateTimePicker1.Value.Year) + Me.DateTimePicker2.Value.AddDays(1).Month - Me.DateTimePicker1.Value.Month
            Dim months As Integer
            Dim days As Integer
    
            If (Me.DateTimePicker2.Value.AddDays(1) >= Me.DateTimePicker1.Value.AddMonths(monthsDiff)) Then
                months = monthsDiff
                days = (Me.DateTimePicker2.Value.AddDays(1) - Me.DateTimePicker1.Value.AddMonths(months)).Days
    
            Else
                months = monthsDiff - 1
                days = (Me.DateTimePicker2.Value.AddDays(1) - Me.DateTimePicker1.Value.AddMonths(months)).Days
            End If
    
            Me.TextBox_MOIS.Text = months
            Me.TextBox_JOURS.Text = days

    Après tout je ne suis pas du tout spécialiste du VB, je pense d'abord C# puis je fait la traduction en VB .NET.

    Il peut donc exister une méthode toute faite pour le calcul que vous cherchez à faire.

    Cordialement.

    • Marked as answer by HappySaid Tuesday, April 10, 2012 4:10 PM
    Tuesday, April 10, 2012 2:57 PM
    Answerer

All replies

  • Bonjour,

    Si on admet qu'un moi vaut 30 jours, le code suivant devrait permettre le calcul de la période entre les deux dates :

    Dim periode = Me.DateTimePicker2.Value - Me.DateTimePicker1.Value
    Me.TextBox_MOIS.Text = periode.Days \ 30
    Me.TextBox_JOURS.Text = periode.Days Mod 30


    Cordialement.

    Tuesday, April 10, 2012 2:09 PM
    Answerer
  • merci MOURAD mais mais voici le problème par exemple :

    la période par exemple  entre : 01/01/2012    et     31/12/2012    est   12 mois et 0 jours

    mais ça marche pas votre code est calculé que 12 mois et 5 jours !!

    Tuesday, April 10, 2012 2:17 PM
  • Regarder la méthode DateDiff(), elle va vous calculer vos valeurs précisément sans trop d'effort.

    Microsoft MVP C# || gabrielmongeon.com || LinkedIn

    Tuesday, April 10, 2012 2:19 PM
    Moderator
  • A bon, vous êtes comme ça vous !!

    Dans ce cas là essayer le code suivant :

            Dim period = Me.DateTimePicker2.Value - Me.DateTimePicker1.Value
            Dim monthsDiff = 12 * (Me.DateTimePicker2.Value.AddDays(1).Year - Me.DateTimePicker1.Value.Year) + Me.DateTimePicker2.Value.AddDays(1).Month - Me.DateTimePicker1.Value.Month
            Dim months As Integer
            Dim days As Integer
    
            If (Me.DateTimePicker2.Value.AddDays(1) >= Me.DateTimePicker1.Value.AddMonths(monthsDiff)) Then
                months = monthsDiff
                days = (Me.DateTimePicker2.Value.AddDays(1) - Me.DateTimePicker1.Value.AddMonths(months)).Days
    
            Else
                months = monthsDiff - 1
                days = (Me.DateTimePicker2.Value.AddDays(1) - Me.DateTimePicker1.Value.AddMonths(months)).Days
            End If
    
            Me.TextBox_MOIS.Text = months
            Me.TextBox_JOURS.Text = days

    Après tout je ne suis pas du tout spécialiste du VB, je pense d'abord C# puis je fait la traduction en VB .NET.

    Il peut donc exister une méthode toute faite pour le calcul que vous cherchez à faire.

    Cordialement.

    • Marked as answer by HappySaid Tuesday, April 10, 2012 4:10 PM
    Tuesday, April 10, 2012 2:57 PM
    Answerer
  • voila un petit truc qui peux t'aider inspire toi de cela

    en remplacant dated et now par tes differentes dates

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim k As Integer
            Dim p As Integer
            Dim dated As Date = CDate("30/7/2012")
            k = DateDiff(DateInterval.Month, Now, dated) 'le nombre de mois entre deux dates
            p = DateDiff(DateInterval.Day, Now, dated) ' le nombre de jour entre deux dates
            If k < 2 Then
                'si le mois de la deuxieme date est le mois suivant afficher le nombre de jour c'est evident
                'de avril a mai on ne va pas afficher 1 mois et ... jours
                MessageBox.Show(p & " jour(s)")
            Else
                'sinon on affiche le nombre de mois entre les deux dates et ensuite le nombre de jours restant
                Dim mois, jour As Integer
                mois = k - 1 'nombre de mois entre les 2 dates exple de avril a juillet il y' a 2 mois
                'recuper le nombre de jour du mois de la 2eme date et le reste des jours de la 1re date
                jour = dated.Day + Date.DaysInMonth(Now.Year, Now.Month) - Now.Day
                MessageBox.Show(mois & " mois " & jour & " jour(s)")
            End If
    
            Me.Close()
    
        End Sub

    en esperant t'avoir aider .

    cordialement


    la FOI déplace les montagnes et bien DOTNET les effaces complétement.


    • Edited by mmw01 Tuesday, April 10, 2012 3:24 PM
    Tuesday, April 10, 2012 3:23 PM
  • Comme disait Ould Mourad son code suppose qu'un mois fait 30 jours (donc 12x30+5=365 jours).

    Sinon voir DateDiff comme indiqué par Gabriel ce qui doit permettre de récupérer la différence en mois puis le reliquat en jours. Noter tout de même qu'une l'unité "mois" est relativement imprécise (variable entre 28 et 31 jours) cela l'usage que vous en aurez.

    Par exemple qq chose comme :

      Sub GetDiff(ByVal d1 As Date, ByVal d2 As Date, ByRef mois As Long, ByRef jours As Long)
            mois = DateDiff(DateInterval.Month, d1, d2)
            jours = DateDiff(DateInterval.Day, d1.AddMonths(CInt(mois)), d2)
        End Sub
    Il faut éventuellement ajouter 1 si vous supposez que la première date commence à 00:00 et que la deuxième date concerne toute la journée (du 01/01/2012 00:00 au 31/12/2012 23:59:59 on a 12 mois mais 11 mois et 30 jours si c'est jusqu'au 31/12/2012 00:00).

    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".



    Tuesday, April 10, 2012 3:25 PM
    Moderator
  • Bonjour,

    Par contre je ne vois pas comment arriver à résoudre le problème avec DateDiff sans tomber dans le premier piège (1 mois = 30 jours).

    Cordialement.

    Tuesday, April 10, 2012 3:35 PM
    Answerer
  • A bon, vous êtes comme ça vous !!

    Dans ce cas là essayer le code suivant :

            Dim period = Me.DateTimePicker2.Value - Me.DateTimePicker1.Value
            Dim monthsDiff = 12 * (Me.DateTimePicker2.Value.AddDays(1).Year - Me.DateTimePicker1.Value.Year) + Me.DateTimePicker2.Value.AddDays(1).Month - Me.DateTimePicker1.Value.Month
            Dim months As Integer
            Dim days As Integer
    
            If (Me.DateTimePicker2.Value.AddDays(1) >= Me.DateTimePicker1.Value.AddMonths(monthsDiff)) Then
                months = monthsDiff
                days = (Me.DateTimePicker2.Value.AddDays(1) - Me.DateTimePicker1.Value.AddMonths(months)).Days
    
            Else
                months = monthsDiff - 1
                days = (Me.DateTimePicker2.Value.AddDays(1) - Me.DateTimePicker1.Value.AddMonths(months)).Days
            End If
    
            Me.TextBox_MOIS.Text = months
            Me.TextBox_JOURS.Text = days

    Après tout je ne suis pas du tout spécialiste du VB, je pense d'abord C# puis je fait la traduction en VB .NET.

    Il peut donc exister une méthode toute faite pour le calcul que vous cherchez à faire.

    Cordialement.

    Merci Ould Mourad ça marche bien en VB..
    Tuesday, April 10, 2012 4:11 PM