Je dois générer un rapport qui montre les 52 semaines d'une année (ou 53 semaines comme certaines années) et leurs dates de début et de fin. Il y a une spécification ISO pour cela, mais cela semble terriblement compliqué! Im espérant que quelqu'un connaisse un moyen de le faire en C# ou Visual Basic (c'est en fait pour Visual Basic 6 mais je vais essayer de le traverser)Calculer la date de début et de fin d'une semaine compte tenu du numéro de semaine et de l'année en C# (basé sur la spécification ISO)
Répondre
utiliser la méthode Calendar.GetWeekOfYear pour obtenir la semaine du datetime actuel, le reste devrait être trivial. Pour vb6 c'est moins trivial, mieux vaut parier trouver une bonne bibliothèque qui fait le dur travail pour vous.
Si vous voulez le faire manuellement, un coup d'oeil à this post.
Vous pouvez utiliser la méthode Calendar.GetWeekOfYear
pour obtenir le numéro de la semaine d'une date, la valeur CalendarWeekRule.FirstFourDayWeek
pour spécifier comment les semaines sont déterminées et DayOfWeek.Monday
pour spécifier le premier jour de la semaine. Cela suit la spécification ISO.
Exemple:
int week = Calendar.GetWeekOfYear(DateTime.Today, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Pour la première date de la première semaine de l'année, vous pouvez commencer à partir du 4 janvier et revenir en arrière jusqu'à ce que vous trouviez le lundi:
DateTime t = new DateTime(DateTime.Today,Year, 1, 4);
while (t.DayOfWeek != DayOfWeek.Monday) t = t.AddDays(-1);
+ 1 On dirait que c'est la meilleure solution - c'est en Visual Basic comme l'exige @Jimbo. Je pense que ça va être utile dans mon scénario (http://stackoverflow.com/questions/9741424/looking-for-definitive-iso-week-calculator-in-visual-basic-in-visual-studio-exp) comme bien. – therobyouknow
Que dois-je utiliser pour importer la bibliothèque de calendrier? Par défaut, Calendar n'est pas défini, donc j'ai besoin de l'importer de quelque part, mais où? – therobyouknow
@therobyouknow: Si vous vérifiez la référence de la classe Calendar http://msdn.microsoft.com/en-us/library/system.globalization.calendar.aspx, vous voyez que c'est dans l'espace de noms 'System.Globalization', donc c'est l'espace de noms que vous devez importer. Comme c'est dans l'assemblage 'mscorlib.dll', vous n'avez pas besoin d'ajouter de référence. – Guffa
Cela devrait fonctionner. Je l'ai utilisé pour les rapports dans le passé. Je suis d'accord que ce n'est pas très joli si:
DateTime GetWeekStartDate(int year, int week)
{
DateTime jan1 = new DateTime(year, 1, 1);
int day = (int)jan1.DayOfWeek - 1;
int delta = (day < 4 ? -day : 7 - day) + 7 * (week - 1);
return jan1.AddDays(delta);
}
Cela calcule la date de début pour une certaine semaine. La date de fin est évidemment 7 jours plus tard (exclusif). Vous pouvez trouver this code of mine utile. Il est à peine documenté, mais il implémente quelques autres opérations sur la structure WeekAndYear qu'il définit. Beaucoup de place pour l'amélioration. Plus particulièrement, il définit <
et >
opérateurs, mais pas d'autres, ce qui est plutôt mauvais ... mais il devrait vous aider à démarrer.
à VB6 bien portage ... Hmm, peut-être pas: P
Ces fonctions couvertes mes exigences (pour ASP classique adapté, donc à des types de données) espoir ils aident d'autres aussi ...
Function WeekNumber(dDate)
Dim d2
d2 = DateSerial(Year(dDate - WeekDay(dDate - 1) + 4), 1, 3)
WeekNumber = Int((dDate - d2 + WeekDay(d2) + 5)/7)
End Function
Function YearStart(iWhichYear)
Dim iWeekDay
Dim iNewYear
iNewYear = DateSerial(iWhichYear, 1, 1)
iWeekDay = (iNewYear - 2) Mod 7
If iWeekDay < 4 Then
YearStart = iNewYear - iWeekDay
Else
YearStart = iNewYear - iWeekDay + 7
End If
End Function
Function WeeksInYear(iYear)
WeeksInYear = WeekNumber(DateAdd("d", -1, YearStart(iYear + 1)))
End Function
Function WeekStart(iYear, iWeek)
WeekStart = DateAdd("ww", iWeek - 1, YearStart(iYear))
End Function
Function WeekEnd(iYear, iWeek)
WeekEnd = DateAdd("d", 6, DateAdd("ww", iWeek - 1, YearStart(iYear)))
End Function
Cela vous donnera le début de la semaine en cours
dateAdd(DateAdd(DateInterval.Day, (Now.Day * -1), Now)
pour obtenir la fin de la semaine ajouter 7 jours au début de la semaine
la réponse est la suivante et est le plus compréhensible
\t '1 declaramos las variables
\t Public firstdayweek As Date 'variable para capturar el valor de inicio de semana de una fecha dada
\t Public lastdayweek As Date 'variable para el valor de la fecha final de una semana de una fecha dada
\t Friend Property _NSemana As Integer 'indica el numero de la semana
\t Friend Property _iniciosemana As Date 'contiene la primer fecha de la semana dada
'Fuciones para codigo
'Funcion para calcular la semana actual en la que estamos
\t Function semana() As Date
_NSemana = (DateDiff(DateInterval.WeekOfYear, DateTime.Today, New DateTime(DateTime.Today.Year, 1, 1)) *-1)
\t End Function
'esta funcion es la que llamaremos para setear cada valor puedes colocarlo en cualquier evento
Public Sub damerangosemana()
\t \t semana()
\t \t _iniciosemana = RangoSemana((_NSemana + 1), Today.Year)
\t \t firstdayweek = _iniciosemana
\t \t lastdayweek = FinSemana(_iniciosemana)
\t End Sub
'con esta funcion capturamos el dia de la semana y asignamos la fecha incial
Public Function RangoSemana(ByVal WeekNumber As Integer, ByVal year1 As Integer) As Date
\t \t Dim numdia As Integer = 0
\t \t Dim oneDate As String
\t \t Dim PrimerDia As Date
\t \t oneDate = "1/1/" & year1.ToString
\t \t PrimerDia = DateAndTime.DateValue(oneDate)
\t \t 'dayOfYear = inDate.DayOfYear
\t \t Select Case PrimerDia.DayOfWeek
\t \t \t Case DayOfWeek.Sunday
\t \t \t \t numdia = 7
\t \t \t Case DayOfWeek.Monday
\t \t \t \t numdia = 1
\t \t \t Case DayOfWeek.Tuesday
\t \t \t \t numdia = 2
\t \t \t Case DayOfWeek.Wednesday
\t \t \t \t numdia = 3
\t \t \t Case DayOfWeek.Thursday
\t \t \t \t numdia = 4
\t \t \t Case DayOfWeek.Friday
\t \t \t \t numdia = 5
\t \t \t Case DayOfWeek.Saturday
\t \t \t \t numdia = 6
\t \t End Select
\t \t Dim x As Date = DateAdd(DateInterval.Day, 0 - numdia, CType(oneDate, Date))
\t \t Dim startdate As Date = DateAdd(DateInterval.WeekOfYear, WeekNumber - 1, x)
\t \t Return startdate
\t End Function
'funcion para calcular la fecha final
Public Function FinSemana(ByVal Date1 As Date) As Date
\t \t Return DateAdd(DateInterval.Day, 7, Date1)
\t End Function
+1 Je soulevai ce code et en a fait retourner un tuple pour la semaine iso – ShuggyCoUk
Urgh, qui est en fait le peu méchant de ce code.Même si, pour une raison quelconque, vous vouliez le renvoyer comme un type primitif unique (mauvaise idée), alors vous devriez utiliser les opérations binaires '&' et shift right plutôt que division et modulo. – Thorarin