J'ai beaucoup cherché sur Google et trouvé beaucoup de solutions, mais aucune ne me donne le bon numéro de semaine pour le 2012-12-31. Même l'exemple sur MSDN ( lien ) échoue.
2012-12-31 est lundi, donc ce devrait être la semaine 1, mais chaque méthode que j'ai essayée me donne 53. Voici quelques-unes des méthodes que j'ai essayées:
De la bibliothèque 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;
Mettre à 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 suivaient 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);
}
Réponses:
Comme indiqué dans cette page MSDN, il existe une légère différence entre la numérotation hebdomadaire ISO8601 et la semaine .Net.
Vous pouvez vous référer à cet article dans le blog MSDN pour une meilleure explication: « Format semaine ISO 8601 de l'année dans Microsoft .Net »
En termes simples, .Net permet de répartir les semaines sur plusieurs années, contrairement à la norme ISO. Dans l'article, il existe également une fonction simple pour obtenir le numéro de semaine ISO 8601 correct pour la dernière semaine de l'année.
Mise à jour La méthode suivante renvoie en fait 1 pour
2012-12-31
ce qui est correct dans ISO 8601 (par exemple en Allemagne).la source
Il peut y avoir plus de 52 semaines dans une année. Chaque année compte 52 semaines complètes + 1 ou +2 (année bissextile) supplémentaires. Ils compensent pour une 53e semaine.
Donc, pour chaque année, vous en avez au moins un par jour supplémentaire. Deux pour les années bissextiles. Ces jours supplémentaires sont-ils comptés comme des semaines distinctes?
Le nombre de semaines dépend vraiment du jour de début de votre semaine. Examinons cela pour 2012.
Vérifiez les paramètres de votre culture actuelle pour voir ce qu'elle utilise comme premier jour de la semaine.
Comme vous le voyez, il est normal d'obtenir 53 en conséquence.
Il est même possible d'avoir une 54e semaine. Se produit tous les 28 ans lorsque le 1er janvier et le 31 décembre sont traités comme des semaines distinctes. Ce doit aussi être une année bissextile.
Par exemple, l'année 2000 comptait 54 semaines. Le 1er janvier (samedi) était le premier jour d'une semaine et le 31 décembre (soleil) était le deuxième jour d'une semaine.
Tirages: Année: 2012 Semaine: 54
Remplacez CalendarWeekRule dans l'exemple ci-dessus par FirstFullWeek ou FirstFourDayWeek et vous en reviendrez 53. Gardons le jour de début lundi puisque nous avons affaire à l'Allemagne.
La semaine 53 commence donc le lundi 31/12/2012, dure une journée puis s'arrête.
53 est la bonne réponse. Changez la culture en Allemagne si vous voulez l'essayer.
la source
Ceci est le chemin:
Le plus important pour est le
CalendarWeekRule
paramètre.Voir ici: https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=IT-IT&k=k(System.Globalization.CalendarWeekRule);k(TargetFrameworkMoniker-.NETFramework
la source
Bonnes nouvelles! Une demande d'extraction s'ajoutant
System.Globalization.ISOWeek
à .NET Core vient d'être fusionnée et est actuellement prévue pour la version 3.0. Espérons que cela se propagera aux autres plates-formes .NET dans un avenir pas trop éloigné.Le type a la signature suivante, qui devrait couvrir la plupart des besoins de la semaine ISO :
Vous pouvez trouver le code source ici .
MISE À JOUR : Ces API ont également été incluses dans la version 2.1 de .NET Standard .
la source
Puisqu'il ne semble pas y avoir de culture .Net qui donne le bon numéro de semaine ISO-8601, je préfère ignorer complètement la détermination de la semaine intégrée et faire le calcul manuellement, au lieu d'essayer de corriger un correct partiellement résultat.
Je me suis retrouvé avec la méthode d'extension suivante:
Tout d'abord,
((int)date.DayOfWeek + 6) % 7)
détermine le numéro de semaine, 0 = lundi, 6 = dimanche.date.AddDays(-((int)date.DayOfWeek + 6) % 7)
détermine la date du lundi précédant le numéro de semaine demandé.Trois jours plus tard, c'est le jeudi cible, qui détermine l'année de la semaine.
Si vous divisez le nombre de jours (basé sur zéro) dans l'année par sept (arrondi vers le bas), vous obtenez le numéro de semaine (basé sur zéro) dans l'année.
En c #, les résultats des calculs entiers sont arrondis implicitement.
la source
Ticks
est le nombre d'incréments de 100 nanosecondes depuis le 1er janvier 0001. Étant donné qu'il y a 86 400 secondes dans une journée, nous pouvons écrire:var thursday = date.AddDays(3 - date.Ticks / 86400 / 10_000_000 % 7); return (thursday.DayOfYear - 1) / 7 + 1;
Dans .NET 3.0 et
ISOWeek.GetWeekOfDate
versions ultérieures, vous pouvez utiliser la méthode -Met .Notez que l'année dans le format de numéro année + semaine peut différer de l'année du en
DateTime
raison des semaines qui traversent la limite de l'année.la source
C # vers le port Powershell à partir du code ci-dessus d' il_guru :
la source
La façon la plus simple de déterminer le style de numéro de semaine ISO 8601 à l'aide de c # et de la classe DateTime.
Demandez ceci: le jeudi combien de eth de l'année est le jeudi de cette semaine. La réponse est égale au numéro de semaine souhaité.
la source
Cela fonctionne bien pour les cultures américaines et russes. ISO 8601 sera également correct, car la semaine russe commence lundi.
la source
Voici une version d'extension et une version nullable de la réponse d' il_guru .
Extension:
Nullable:
Coutumes:
la source
La question est: comment définissez-vous si une semaine est en 2012 ou en 2013? Votre supposition, je suppose, est que puisque 6 jours de la semaine sont en 2013, cette semaine devrait être marquée comme la première semaine de 2013.
Je ne sais pas si c'est la bonne façon de procéder. Cette semaine a commencé en 2012 (le lundi 31 décembre), elle devrait donc être marquée comme la dernière semaine de 2012, elle devrait donc être le 53 décembre 2012. La première semaine de 2013 devrait commencer le lundi 7 décembre.
Maintenant, vous pouvez gérer le cas particulier des semaines marginales (première et dernière semaine de l'année) en utilisant les informations du jour de la semaine. Tout dépend de votre logique.
la source
la source
Sur la base de la réponse d'il_guru, j'ai créé cette version pour mes propres besoins qui renvoie également le composant année.
la source
Ces deux méthodes vous aideront, en supposant que notre semaine commence lundi
la source
Une année compte 52 semaines et 1 jour ou 2 en cas d'année par tour (52 x 7 = 364). 2012-12-31 serait la semaine 53, une semaine qui n'aurait que 2 jours car 2012 est une année-tour.
la source
la source