2009-08-04 4 views
4

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

1

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.

2

Si vous voulez le faire manuellement, un coup d'oeil à this post.

+0

+1 Je soulevai ce code et en a fait retourner un tuple pour la semaine iso – ShuggyCoUk

+0

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

5

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); 
+0

+ 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

+0

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

+1

@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

2

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

2

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 
1

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

0

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