J'ai beaucoup cherché sur Google et trouvé de nombreuses solutions, mais aucune d'entre elles ne me donne le numéro de semaine correct pour le 2012-12-31. Même l'exemple sur MSDN ( lien ) échoue.
2012-12-31 est un lundi, donc ce devrait être la semaine 1, mais toutes les méthodes que j'ai essayées me donnent 53. Voici quelques-unes des méthodes que j'ai essayées :
De la bibliothèque du MDSN :
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar;
return cal.GetWeekOfYear(date, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
Solution 2 :
return new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Solution 3 :
CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;
Mise à jour
La méthode suivante renvoie en fait 1 lorsque la date est 2012-12-31. En d'autres termes, mon problème était que mes méthodes ne respectaient pas la norme ISO-8601.
// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
// Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll
// be the same week# as whatever Thursday, Friday or Saturday are,
// and we always get those right
DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
{
time = time.AddDays(3);
}
// Return the week of our adjusted day
return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
10 votes
Comment est la semaine 1 à la fin de l'année ? Je veux dire, je vois où tu veux en venir. Mais 53 a du sens pour moi.
1 votes
Dans mes extraits de code, j'obtiens les CultureInfo et autres. Je pensais que mon programme savait déjà quel calendrier j'utilisais. (Ici, en Allemagne, le 31 décembre 2012 est la première semaine de 2013).
0 votes
Ce code ne fonctionne pas tout à fait comme il devrait essayer les dates 31-dec-2016 par exemple ou 1-jan-2016
0 votes
@cavej03 31-dec-2016 est la semaine 52 et le GetIso8601WeekOfYear retourne 52 donc je suppose que cela fonctionne correctement.