IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Manipulation de dates (intervalle, Mini, Max, durée etc.)


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut Manipulation de dates (intervalle, Mini, Max, durée etc.)
    Bonjour à tous,

    Ha cela m’énerve, j'ai vraiment du mal avec la manipulation de date.

    Donc j'expose mon souci:

    Je dois comparer les données stocké dans un Dictionnaire (Date,Double)

    Exemple de données:
    Key Donnée
    20/10/2011 07:00:00 / 0
    20/10/2011 07:10:00 / 0
    20/10/2011 07:20:00 / 5
    20/10/2011 07:30:00 / 5
    20/10/2011 07:40:00 / 6
    20/10/2011 07:50:00 / 4
    20/10/2011 08:00:00 / 0
    20/10/2011 08:10:00 / 0
    20/10/2011 08:20:00 / 0
    20/10/2011 08:30:00 / 2
    20/10/2011 08:40:00 / 2
    20/10/2011 08:50:00 / 0

    l'exemple n'est qu'un exemple car je peux avoir des données sur plusieurs jour voir années, comparer seulement les minutes ne suffirait pas.
    Les données indique une puissance fourni par un groupe électrogène. Lorsqu'elle est à 0 c'est qu'il est arrêté, toutes autres valeur indique qu'il est en fonctionnement.

    Je dois récupérer, concernant les dates: (Peut donc être en heures, minutes,jours, mois, années, suivant la taille du fichier)

    1) La durée de fonctionnement total.
    2) Intervalle minimum entre chaque fonctionnement.
    3) Intervalle maximum entre chaque fonctionnement.
    4) La moyenne de ces intervalles.

    j'ai commencé et je continue après l’écriture de ce post.
    C'est pas encore fini, et non fonctionnels , mais je sens que je m'enlise.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
        Public Function TempUtilisation(ByVal Liste As Dictionary(Of Date, Double), ByRef DateMin As Date, ByRef DateMax As Date, ByRef DateAver As Date) As Date
            Dim OneMesure As Boolean = True
            Dim OneDurree As Boolean = True
            Dim SaveDateOne As Date
            Dim SaveDateTwo As Date
            Dim DureeFonctionnement As Date
            Dim DureeTotal As Date
     
            Dim Production As Boolean = False
            Try
                For Each Dt As Date In Liste.Keys
                    If Liste(Dt) <> 0 Then
                        If Not Production Then
                            SaveDateOne = Dt
                            Production = True
                        Else
                            SaveDateTwo = Dt
                        End If
                    Else
                        If Production Then
                            DureeFonctionnement = Convert.ToDateTime(DateTime.op_Subtraction(SaveDateTwo, SaveDateOne))
                            If OneMesure Then
                                DateMin = DureeFonctionnement
                                DateMax = DureeFonctionnement
                                OneMesure = False
                            Else
                                If DureeFonctionnement < DateMin Then
                                    DateMin = DureeFonctionnement
                                End If
                                If DureeFonctionnement > DateMax Then
                                    DateMax = DureeFonctionnement
                                End If
                                If OneDurree Then
     
                                End If
     
                            End If
                        End If
                    End If
                Next
                Return DureeTotal
            Catch ex As Exception
                Return Nothing
     
            End Try
        End Function

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select * From Fonctionnement
    Where Puissance = 0;
    2) Calcul intervarlle

    puis tu fais une somme des intervalle, tu recherche le plus grand et le plus petit

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Ah oui te fais 2 intervalles

    L'intervalle de temps entre en fonctionnement et l'intervalle de temps en arrêt

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    Personnellement j'aurai écris ça comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Dim minInactive As TimeSpan	' Temps minimal d'inactivité
    Dim maxInactive As TimeSpan	' Temps maximal d'inactivité
    Dim totInactive As TimeSpan	' Temps total d'inactivité
    Dim inactivityCount As Integer ' Nombre de plages d'inactivité
     
    Dim stopDate As DateTime	' Date et heure de fin
    Dim isActive As Boolean		' Etat d'activité courant
     
    Dim isInit As Boolean = False ' Permet de lancer le traitement
     
    totInactive = New TimeSpan(0) ' Temps total d'inactivité à zéro au début
    Dim en As Dictionary(Of Date, Double).Enumerator = Liste.GetEnumerator()
    While (en.MoveNext())
    	' Au premier tour de la boucle on initialise avec les valeurs contenues
    	If isInit = False Then
    		stopDate = en.Current.Key
    		If en.Current.Value = 0 Then
    			isActive = False
    		Else
    			isActive = True
    		End If
    		isInit = True
    	End If
     
    	If en.Current.Value = 0 Then ' Inactif
    		If isActive = True Then	' Devient inactif
    			stopDate = en.Current.Key
    		End If
    	Else ' Actif
    		If isActive = False Then ' Devient actif
    			Dim currentInactivity As TimeSpan = en.Current.Key - stopDate ' Calcule le temps d'inactivité de la plage courante
    			If currentInactivity < minInactive Then minInactive = currentInactivity ' On met à jour l'inactivité minimale
    			If currentInactivity > maxInactive Then maxInactive = currentInactivity ' On met à jour l'inactivité maximale
    			totInactive = totInactive + currentInactivity ' Met à jour le temps totale d'inactivité
    			inactivityCount = inactivityCount + 1 ' Met à jour le nombre de plages d'inactivité
    		End If
    	End If
    End While
    Dim AverageInactivity As TimeSpan = New TimeSpan(CLng(totInactive.Ticks / inactivityCount)) ' Moyenne de durée des plages d'inactivité
    En supposant que le dictionnaire des valeurs est trié, si ce n'est pas le cas, il faudrait surement commencer par ça.

  5. #5
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Merci beaucoup, de retour de vacance je viens de voir vos réponses, je vais regarder sa avec intérêt. merci.

  6. #6
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Voila en me basant sur votre code que j'ai modifié légèrement cela me semble pas mal du tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Public Function TempUtilisation(ByVal Liste As Dictionary(Of Date, Double), ByRef minInactive As TimeSpan, ByRef maxInactive As TimeSpan, ByRef AverageInactivity As TimeSpan, Optional ByVal Interval As Integer = 5) As TimeSpan
            Dim totInactive As TimeSpan ' Temps total d'inactivité
            Dim inactivityCount As Integer ' Nombre de plages d'inactivité
            Dim totActive As New TimeSpan   ' Temps d'activité
            Dim DerDate As DateTime
            Dim stopDate As DateTime    ' Date et heure de fin
            Dim startDate As DateTime   ' Date et heure de debut d'activité
            Dim isActive As Boolean     ' Etat d'activité courant
     
            Dim isInit As Boolean = False ' Permet de lancer le traitement
            Dim firstVal As Boolean = True ' 1ere mesures
            totInactive = New TimeSpan(0) ' Temps total d'inactivité à zéro au début
            Dim en As Dictionary(Of Date, Double).Enumerator = Liste.GetEnumerator()
     
            While (en.MoveNext())
                ' Au premier tour de la boucle on initialise avec les valeurs contenues
                If isInit = False Then
                    stopDate = en.Current.Key
                    If en.Current.Value = 0 Then
                        isActive = False
                    Else
                        isActive = True
                    End If
                    isInit = True
                End If
     
                If en.Current.Value = 0 Then ' Inactif
                    If isActive = True Then ' Devient inactif
                        stopDate = en.Current.Key
                        If stopDate - startDate < TimeSpan.FromMinutes(Interval) Then
                            totActive += TimeSpan.FromMinutes(Interval)
                        Else
                            totActive += stopDate - startDate
                        End If
     
                        isActive = False
                    End If
                Else ' Actif
                    If isActive = False Then ' Devient actif
                        startDate = en.Current.Key
                        isActive = True
                        Dim currentInactivity As TimeSpan = en.Current.Key - stopDate ' Calcule le temps d'inactivité de la plage courante
                        If firstVal Then
                            minInactive = currentInactivity
                            maxInactive = currentInactivity
                            firstVal = False
                        Else
                            If currentInactivity < minInactive Then minInactive = currentInactivity ' On met à jour l'inactivité minimale
                            If currentInactivity > maxInactive Then maxInactive = currentInactivity ' On met à jour l'inactivité maximale
                        End If
     
     
                        totInactive = totInactive + currentInactivity ' Met à jour le temps totale d'inactivité
                        inactivityCount = inactivityCount + 1 ' Met à jour le nombre de plages d'inactivité
                    End If
                End If
                DerDate = en.Current.Key
     
            End While
            'Dernier calcul
            If isActive = False Then ' Inactif
                Dim currentInactivity As TimeSpan = DerDate - stopDate ' Calcule le temps d'inactivité de la plage courante
                If currentInactivity < minInactive Then minInactive = currentInactivity ' On met à jour l'inactivité minimale
                If currentInactivity > maxInactive Then maxInactive = currentInactivity ' On met à jour l'inactivité maximale
                totInactive = totInactive + currentInactivity ' Met à jour le temps totale d'inactivité
                inactivityCount = inactivityCount + 1 ' Met à jour le nombre de plages d'inactivité
            Else
                If DerDate - startDate < TimeSpan.FromMinutes(Interval) Then
                    totActive += TimeSpan.FromMinutes(Interval)
                Else
                    totActive += DerDate - startDate
                End If
            End If
            AverageInactivity = New TimeSpan(CLng(totInactive.Ticks / inactivityCount)) ' Moyenne de durée des plages d'inactivité
            Return totActive
     
        End Function
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Manipulations de dates et heures
    Par benj63 dans le forum C++
    Réponses: 5
    Dernier message: 16/12/2004, 15h09
  2. [JDBC] manipulation des dates/heures en Java
    Par kurkLord dans le forum JDBC
    Réponses: 6
    Dernier message: 09/08/2004, 12h49
  3. Manipulations des Dates
    Par kurtc dans le forum Langage SQL
    Réponses: 11
    Dernier message: 13/04/2004, 14h39
  4. [IB6][BCB5]Manipulation des dates.
    Par Sitting Bull dans le forum SQL
    Réponses: 4
    Dernier message: 09/04/2004, 15h33
  5. Manipuler des dates...
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 4
    Dernier message: 26/06/2003, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo