2008-09-18 5 views
0

Si j'ai une valeur time_t de gettimeofday() ou compatible dans un environnement Unix (par exemple, Linux, BSD), y a-t-il un algorithme compact disponible qui serait capable de me dire le numéro de semaine correspondant dans le mois?Unix gettimeofday() - algorithme compatible pour déterminer la semaine dans le mois?

Idéalement, la valeur de retour fonctionnerait de la même façon que %W se comporte en strftime(), sauf donner la semaine dans le mois plutôt que la semaine dans l'année.

Je pense que Java a un jeton de formatage W qui fait quelque chose de plus ou moins comme ce que je demande.


[Tout ci-dessous écrit après les réponses ont été publiés par David Nehme, Branan et Sparr.]

J'ai réalisé que pour revenir ce résultat d'une manière similaire à %W, nous voulons compter le nombre de Les lundis qui ont eu lieu dans le mois jusqu'à présent. Si ce nombre est zéro, alors 0 doit être retourné.

Merci à David Nehme et Branan en particulier pour leurs solutions qui ont démarré les choses sur la bonne voie. Le bit de code renvoyant [en utilisant les noms de variables de Branan] ((ts->mday - 1)/7) indique le nombre de semaines complètes qui se sont produites avant le jour actuel.

Cependant, si nous comptons le nombre de lundis qui se sont produits jusqu'ici, nous voulons compter le nombre de semaines intégrales, y compris aujourd'hui, puis considérer si la semaine fractionnaire restante contient également des lundis. Pour déterminer si la semaine fractionnaire restante après avoir sorti toutes les semaines contient un lundi, nous devons considérer ts->mday % 7 et le comparer au jour de la semaine, ts->wday. C'est facile à voir si vous écrivez les combinaisons, mais si nous assurons que le jour n'est pas le dimanche (wday > 0), alors à tout moment ts->wday <= (ts->mday % 7) nous devons incrémenter le nombre de lundis par 1. Cela vient de considérer le nombre de jours depuis le début du mois, et si, sur la base du jour de la semaine en cours dans la première semaine fractionnaire, la semaine fractionnaire contient un lundi.

donc je réécrire la déclaration de retour de Branan comme suit:

return (ts->tm_mday/7) + ((ts->tm_wday > 0) && (ts->tm_wday <= (ts->tm_mday % 7)));

Répondre

1

En supposant que votre première semaine est la semaine 1:

int getWeekOfMonth() 
{ 
    time_t my_time; 
    struct tm *ts; 

    my_time = time(NULL); 
    ts = localtime(&my_time); 

    return ((ts->tm_mday -1)/7) + 1; 
} 

Pour 0-index, déposez le +1 dans la déclaration de retour .

1

Si vous définissez la première semaine comme étant les jours 1-7 du mois, les jours de la deuxième semaine 8-14, ... alors le code suivant fonctionnera.

int week_of_month(const time_t *my_time) 
{ 
    struct tm *timeinfo; 

    timeinfo =localtime(my_time); 
    return 1 + (timeinfo->tm_mday-1)/7; 

} 
0

ce pseudo-Tenir compte du code, puisque je suis en train d'écrire dans la plupart du temps, mais la syntaxe C prétendant que je peux emprunter des fonctionnalités d'autres langues (string-> Affectation int, string-> conversion de temps). Adaptez ou développez pour la langue de votre choix.

int week_num_in_month(time_t timestamp) { 
    int first_weekday_of_month, day_of_month; 
    day_of_month = strftime(timestamp,"%d"); 
    first_weekday_of_month = strftime(timefstr(strftime(timestamp,"%d/%m/01")),"%w"); 
    return (day_of_month + first_weekday_of_month - 1)/7 + 1; 
} 

Il est évident que je suppose que vous voulez gérer semaines du mois la façon dont les fonctions de temps standard gèrent semaines de l'année, par opposition à quelques jours 1-7, 8-13, etc.

Questions connexes