Bonjour à tous,

je viens vers vous car je rencontre un problème au niveau de la récupération d'une date.

j'ai créé une form qui permet de faire défiler les semaines suivant une année et suivant la semaine affichée, j'ai un label qui affiche la date du début de la semaine ( celle du lundi ) et la date de la fin de semaine ( le vendredi dans ce cas )

Nom : FormSemainforum.png
Affichages : 465
Taille : 5,2 Ko

Tout à l'air de fonctionner sauf pour la semaine 52 de 2022 ou il m'affiche les dates de la 1ere semaine de 2023 Tout en gardant l'année 2022 !

Je n'arrive pas à trouver le problème, si l'un de vous peux me conseiller ça serait bienvenu

Je vous donne le code de la Form

Merci par avance
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
Imports System.Globalization
Public Class Form1
 
 
    Private NumeroSemaineSelecteur, AnneeSelecteur, MaxSemaineAnne As Integer
    Private Lundi As DateTime ' lundi du début de la semaine
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
        NumeroSemaineSelecteur = WeekNumber(Date.Now)
        AnneeSelecteur = AnneeEncours()
 
        LabelSemaine.Text = NumeroSemaineSelecteur.ToString
        LabelAnnee.Text = AnneeSelecteur.ToString
 
        MaxSemaineAnne = CalCulNbreSemaineAnnee(AnneeSelecteur) ' on calcule le nombre de semaines dans l'année selectionnée
 
        Label13.Text = "(Semaine" & GetDatesSemaine(NumeroSemaineSelecteur, False) & ")"
 
    End Sub
 
#Region "Boutons"
    Private Sub ButSemainePlus_Click(sender As Object, e As EventArgs) Handles ButSemainePlus.Click
        If NumeroSemaineSelecteur >= MaxSemaineAnne Then
            AnneeSelecteur = AnneeSelecteur + 1
            LabelAnnee.Text = AnneeSelecteur.ToString
            NumeroSemaineSelecteur = 1
            MaxSemaineAnne = CalCulNbreSemaineAnnee(AnneeSelecteur) ' on calcule le nombre de semaines dans l'année selectionnée
        Else
            NumeroSemaineSelecteur = NumeroSemaineSelecteur + 1
        End If
        LabelSemaine.Text = NumeroSemaineSelecteur.ToString
 
        Label13.Text = "(Semaine" & GetDatesSemaine(NumeroSemaineSelecteur, False) & ")"
 
    End Sub
 
    Private Sub ButSemaineMoins_Click(sender As Object, e As EventArgs) Handles ButSemaineMoins.Click
        If NumeroSemaineSelecteur <= 1 Then
            AnneeSelecteur = AnneeSelecteur - 1
            LabelAnnee.Text = AnneeSelecteur.ToString
            MaxSemaineAnne = CalCulNbreSemaineAnnee(AnneeSelecteur) ' on calcule le nombre de semaines dans l'année selectionnée
            NumeroSemaineSelecteur = MaxSemaineAnne
        Else
            NumeroSemaineSelecteur = NumeroSemaineSelecteur - 1
        End If
        LabelSemaine.Text = NumeroSemaineSelecteur.ToString
        Label13.Text = "(Semaine" & GetDatesSemaine(NumeroSemaineSelecteur, False) & ")"
 
    End Sub
 
 
#End Region
 
 
#Region "Fonctions"
 
    ''' <summary>
    ''' Retourne le nombre de semaines dans l'année selectionnée
    ''' </summary>
    ''' <param name="AnneRecup"></param>
    ''' <returns></returns>
    Private Function CalCulNbreSemaineAnnee(ByVal AnneRecup As Integer) As Integer
 
        Dim AnneeRecup As Integer = AnneRecup
        ' Dim Anneesuivante As Integer = AnneeRecup + 1
        Dim DateDebutAnnee As Date = Convert.ToDateTime("01/01/" & AnneeRecup.ToString)
        Dim DateFintAnnee As Date = Convert.ToDateTime("31/12/" & AnneeRecup.ToString)
        '   Dim DateDebutNouvelleAnne = Convert.ToDateTime("01/01/" & Anneesuivante.ToString)
        Dim ts As TimeSpan = DateFintAnnee - DateDebutAnnee
        Dim PremierjourAnnee As String = DateDebutAnnee.ToString("dddd", New CultureInfo("fr-FR"))
        ' Dim DernierJourAnnee As String = DateFintAnnee.ToString("dddd", New CultureInfo("fr-FR"))
        ' Dim PremierJourNouvelleAnnee As String = DateDebutNouvelleAnne.ToString("dddd", New CultureInfo("fr-FR"))
        Dim Resultat As Integer
        Dim AnneeBisextile As Boolean
 
        ' on contrôle si c'est une année bisextile 
        If (DateTime.IsLeapYear(AnneeRecup)) Then
            AnneeBisextile = True
        Else
            AnneeBisextile = False
        End If
 
        If AnneeBisextile = True Then
            If PremierjourAnnee = "mercredi" Or PremierjourAnnee = "jeudi" Then
                Resultat = CInt(ts.TotalDays / 7) + 1
            Else
                Resultat = CInt(ts.TotalDays / 7)
            End If
        Else
            If PremierjourAnnee = "jeudi" Then
                Resultat = CInt(ts.TotalDays / 7) + 1
            Else
                Resultat = CInt(ts.TotalDays / 7)
            End If
 
        End If
 
        Return Resultat
 
 
    End Function
 
 
    ''' <summary>
    ''' Retourne la date de début et de fin de la semaine
    ''' </summary>
    ''' <param name="NumeroSemaine"></param>
    ''' <param name="RecupLundi"></param>
    ''' <returns></returns>
    Private Function GetDatesSemaine(NumeroSemaine As Integer, RecupLundi As Boolean) As String
 
        Dim Calendrier As New GregorianCalendar(GregorianCalendarTypes.Localized)
        Dim DateLundi, DateVendredi As Date
        Dim Semaine As Integer = 0
        Dim DateCal As Date = Convert.ToDateTime("01/01/" & AnneeSelecteur.ToString)
        While Semaine <> NumeroSemaine
            DateCal = DateCal.AddDays(1)
            Semaine = Calendrier.GetWeekOfYear(DateCal, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
        End While
        DateLundi = DateCal
        If RecupLundi = True Then Lundi = DateCal ' on ne récupère la date du lundi que de la première semaine
        DateVendredi = DateCal.AddDays(4)
        Return " du " & DateLundi.ToShortDateString & " au " & DateVendredi.ToShortDateString
 
    End Function
 
 
    ''' <summary>
    ''' Retourne le numéro de la semaine
    ''' </summary>
    ''' <param name="DateJour"></param>
    ''' <returns></returns>
    Private Function WeekNumber(DateJour As DateTime) As Integer
 
        Return New GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(DateJour, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
 
    End Function
 
 
    ''' <summary>
    ''' Retourne l'année en cours
    ''' </summary>
    ''' <returns></returns>
    Public Shared Function AnneeEncours() As Integer
        Return DateTime.Now.Year
    End Function
 
#End Region
 
 
End Class