Discuter:ISO 8601

Un article de Wikipédia, l'encyclopédie libre.

exemple en asp A Bergamini, Fonction Semaine Calcul le numéro de semaine d'une date

Function Semaine(StrDate )
Jeudi=StrDate+4-weekday(StrDate,2)
Janvier4=Cdate("04/01/"&Year(Jeudi))
Lundi4=Janvier4-Weekday(Janvier4,2)
NbJ=Jeudi-Lundi4
Semaine=Right("0"&round(NbJ/7+.5),2)
End Function

(ajouté par une IP, déplacé en page de discussion par / DC2 • )

Code en VisualBasic.Net 1 et 2 basé sur le source fourni en ASP


 Function NumeroSemaine(ByVal dtDate As Date) As Int32
   ' Retourne le numéro de la semaine conformement à la norme ISO8601
   Dim iNumSemaine As Int32
   Dim dtJeudi As Date = DateAdd(DateInterval.Day, 4, dtDate)
   Dim iJourSemaine As Int32 = JourSemaine(dtDate)
   dtJeudi = DateAdd(DateInterval.Day, -iJourSemaine, dtJeudi)
   Dim dtJanvier4 As Date = New Date(dtJeudi.Year, 1, 4)
   Dim dtLundi4 As Date = DateAdd(DateInterval.Day, -JourSemaine(dtJanvier4), dtJanvier4)
   Dim iNbJour As Int32 = DateDiff(DateInterval.Day, dtLundi4, dtJeudi)
   iNumSemaine = Right("0" & Math.Round(iNbJour / 7 + 0.5), 2)
   Return iNumSemaine
 End Function
 Private Function JourSemaine(ByVal dtDate As Date) As Int32
   ' Retourne le jour de la semaine du lundi (1) au dimanche (7)
   Dim iJourSemaine As Int32 = dtDate.DayOfWeek
   If iJourSemaine = 0 Then iJourSemaine = 7
   Return iJourSemaine
 End Function

Code en VisualBasic.Net

Nous proposons une autre fonction de calcul, basée sur une expression simplifiée de l'algorithme de référence. La date courante est rapportée au jeudi de la semaine courante. Par exemple, pour un lundi, on se rapporte au jeudi suivant ; pour un dimanche, on se rapporte au jeudi précédent. Le numéro de la semaine courante est égal au nombre de semaines complètes entre ce jeudi courant et le début de l'année (de ce jeudi-là) + 1. Autrement dit, cela correspond au numéro de jour de l'année de ce jeudi courant divisé par 7 (le nombre de jours dans une semaine)(division arrondie à l'entier inférieur) et plus 1 (premier numéro de semaine dans l'année).

 Public Function Semaine(ByVal D As Date) As Integer
   Return CInt(D.AddDays(D.DayOfWeek.Thursday - NormaliserJourSemaine(D.DayOfWeek)).DayOfYear / 7) + 1
 End Function
 Public Function NormaliserJourSemaine(ByVal J As Integer) As Integer
   '.NET ne respecte pas la norme ISO : il retourne 0 pour dimanche
   If J = 0 Then Return 7 Else Return J
 End Function

Voici une proposition pour Visual C++ en utilisant la classe COleDateTime.

#include <afxdisp.h>
int ReturnNumOfWeek(int Year, int Month, int Day)
{
   COleDateTime  Curtime,Le4janv ;
   int JeudiDay,lelundidelapremsem,NumWeek;
   
   if(Curtime.SetDate(Year, Month, Day)) // Si fonction retourne 1 alors erreur et retour -1
     return -1;
   
   //Calcul du jeudi associé au jour de la semaine courante
   JeudiDay = Curtime.GetDayOfYear() + 4 - (int)fmod(Curtime.GetDayOfWeek()-2+7,7);
   //Création de l'objet COleDateTime correpondant au 04/01 de l'année en cours
   Le4janv  = COleDateTime(Curtime.GetYear(),01,04,0,0,0);
   //Calcul du lundi associé
   lelundidelapremsem = 8 - (int)fmod(Le4janv.GetDayOfWeek()-2+7,7);
   
   //Calcul du numéro de la semaine en cours
   NumWeek = int(((double)JeudiDay-(double)lelundidelapremsem)/7.0+0.5)+1;
   
   return NumWeek;      
 }

[modifier] Il manque des choses

Il serait utile d'avoir la date de création de la norme, et des exemples de commandes permettant d'obtenir la date à ce format.--195.83.89.138 (d) 11 février 2008 à 16:36 (CET)