Algorithme pour calculer une semaine # à partir d'une date avec le début personnalisé de la semaine? (pour ical)

StackOverflow https://stackoverflow.com/questions/8999892

Question

Je ne peux trouver que l'algorithme pour obtenir une semaine ISO 8601 (la semaine commence un lundi).

Cependant, le ical Spec dit

Une semaine est définie comme une période de sept jours, à partir du jour de la semaine défini comme le début de la semaine (voir WKST). La semaine numéro un de l'année civile est la première semaine qui contient au moins quatre (4) jours au cours de cette année civile.

Par conséquent, il est plus complexe que l'ISO 8601, car le début de la semaine peut être n'importe quel jour de la semaine.

Y a-t-il un algorithme pour déterminer quel est le numéro de la semaine d'une date, avec un jour de début personnalisé de la semaine?

ou ... y a-t-il une fonction dans ical4j ça fait ça? Déterminer un Weekno à partir d'une date?

Merci!

PS Limitation: j'utilise un langage JVM qui ne peut pas étendre une classe Java, mais je peux invoquer des méthodes Java ou des classes Java instanciées.

Était-ce utile?

La solution 2

  1. Laisser daysInFirstWeek être le nombre de jours de la première semaine de l'année qui se trouvent en janvier. La semaine commence sur un WKST journée. (par exemple si le 1er janvier est un WKST jour, retour 7)

  2. Régler dayOfYear aux n-jours de l'année de la date d'entrée (par exemple, 1er février = 32)

  3. Si dayOfYear est inférieur ou égal à daysInFirstWeek

    3.1. si daysInFirstWeek est supérieur ou égal à 4, weekNo est 1, sautez à l'étape 5.

    3.2. Laisser daysInFirstWeekOfLastYear être le nombre de jours de la première semaine de l'année précédente en janvier. La semaine commence sur un WKST journée.

    3.3. si daysInFirstWeekOfLastYear est 4 ou l'année dernière est un an et daysInFirstWeekOfLastYear est 5, weekNo est 53, sinon weekNo est 52, sautez à l'étape 5.

  4. Régler weekNo à ceiling((dayOfYear - daysInFirstWeek) / 7)

    4.1. si daysInFirstWeek supérieur ou égal à 4, incrément weekNo par 1

    4.2. si daysInFirstWeek égal à 53 et compte de jours la première semaine (à partir de WKST) de janvier de l'année de inputDateL'année + 1 est supérieure ou égale à 4, définie weekNo à 1

  5. revenir weekNo

Autres conseils

if (input_date < firstDateOfTheYear(WKST, year))
{
    return ((isLeapYear(year-1))?53:52);
}
else
{
    return ((dayOfYear(input_date) - firstDateOfTheYear(WKST, year).day)/7 + 1);
}

FirstDateofTheyEar renvoie la première date de calendrier compte tenu d'un début de semaine (WKST) et de l'année, par exemple si wkst = jeudi, année = 2012, alors il revient le 5 janvier.

Dayofyear renvoie le jour numérique séquence de l'année, par exemple le 1er février = 32

Exemple 1: 18 janvier 2012, le début de la semaine est lundi

  • dayofyear (18 janvier 2012) = 18
  • FirstDateOfTheyEar (lundi 2012) = 2 janvier 2012

(18 - 2) / 7 + 1 = 3 Réponse Semaine no. 3

Exemple n ° 2: 18 janvier 2012, le début de la semaine est jeudi

  • dayofyear (18 janvier 2012) = 18
  • FirstDateOfTheyEar (jeudi 2012) = 5 janvier 2012

(18 - 5) / 7 + 1 = 2 Réponse Semaine no. 2

Exemple # 3: 1er janvier 2012, le début de la semaine est lundi

  • FirstDateOfTheyEar (lundi 2012) = 2 janvier 2012
  • Isleapyear (2012-1) = false

1er janvier 2012 <2 janvier 2012 Réponse Semaine no. 52

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top