Gebruik van weeknummers in ColdFusion

09-08-2011 | Marcel van Langen | ColdFusion | weeknummers, datum, data, conversie

ColdFusion maakt voor haar weeknummers gebruik van de Amerikaanse weeknummers. Helaas wijkt deze af van de weeknummers zoals die worden gebruikt in zo ongeveer de rest van de wereld. En dus is het noodzakelijk om wat extra code te gebruiken om dit recht te trekken. Hoewel er al wat functies her en der beschikbaar zijn, heb ik bewust gekozen voor een wat andere opzet.

Bij nogal wat zakelijke toepassingen spelen weeknummers een grote rol. Dit is vooral het geval bij toepassingen waarbij data een belangrijke rol vervullen. Denk aan planningstools, kalenders en dergelijke. Nu wil het geval dat Amerika en Japan een andere rekenmethode aanhouden bij het bepalen van het weeknummer dan zo ongeveer de rest van de wereld. Hun week begint bijvoorbeeld op zondag. Op zich geen probleem natuurlijk, maar helaas is het via de SetLocale van ColdFusion niet mogelijk om de Week-functie te beinvloeden. En dus levert dit voor Nederland onjuiste resultaten op.

Er zijn functies (bijvoorbeeld in de vorm van UDF's) beschikbaar die van een opgegeven datum het bijpassende Nederlandse weeknummer teruggeven. Dit is echter voor mij niet voldoende. Ik wil ook snel vragen kunnen beantwoorden als: 'wat is de eerste dag van week 14 van 2011' of 'welk weeknummer is het laatste weeknummer van 2012' of 'geef me alle dinsdagen in 2011'. Ik wil kortom op meerdere manieren de weeknummers inzetten. Vandaar dat ik ervoor gekozen heb de data op te slaan in een tabel en deze via de APPLICATION scope weer beschikbaar te maken.

Om dit mogelijk te maken start ik met een eenvoudige tabel die de volgende velden bevat:

  • fwe_jaar - INT - NOT NULL (het bijbehorende jaar)
  • fwe_week - INT - NOT NULL (het bijbehorende weeknummer)
  • fwe_datum - DATE - NOT NULL (de daadwerkelijke datum)
  • fwe_dag - INT - NOT NULL (hoeveelste dag van de week)

Deze tabel ga ik vullen met een ruime hoeveelheid dagen, startend op een vooraf vastgestelde datum. Ik heb ervoor gekozen om 7000 records (en dus dagen) toe te voegen, genoeg om de applicatie de komende 20 jaar te laten draaien. Hieronder volgt de code om de tabel te vullen. Het is zeker niet de meest efficiente code, maar het is dan ook bedoeld om eenmalig te draaien. Ik heb een en ander voorzien van commentaar.

<!--- Wat is de datum waarop we gaan starten? --->
<cfset variables.startdatum = "26-12-2010" />

<!--- Hoeveel dagen gaan we in het systeem zetten? --->
<cfset variables.aantal_dagen = "7000" />

<!--- Eerst gaan we de tabel FRANZ_weeknummer leeggooien --->
<cfquery datasource="#application.datasource#" name="qryDelete">
DELETE FROM FRZ_weeknummer
</cfquery>

<!--- Nu gaan we over de dagen heen loopen --->
<cfloop from="1" to="#variables.aantal_dagen#" index="i">
<!--- Wat is nu de feitelijke dag --->
<cfset variables.rekendatum = DateAdd("d",i,variables.startdatum) />
<!--- Wat voor soort jaar gaat het hier om? --->
<cfset variables.YearType = DayOfWeek("01/01/"&DatePart("yyyy",variables.rekendatum))-2 />
<cfif variables.YearType LT 0>
<cfset variables.YearType = variables.YearType+7 />
</cfif>
<!--- Wat is het voorlopige weeknummer --->
<cfset variables.WeekNumber = Ceiling((DayOfYear(variables.rekendatum)+variables.YearType)/7) />
<!--- Wat is het voorlopige jaarnummer --->
<cfset variables.YearNumber = DatePart("yyyy",variables.rekendatum) />
<!--- Nu gaan we dit corrigeren voor de uitzonderingen --->
<cfswitch expression="#variables.YearType#">
<cfcase value="2">
<cfif variables.WeekNumber IS 53 AND NOT IsLeapYear(DatePart("yyyy",variables.rekendatum))>
<cfset variables.WeekNumber = 1 />
<cfset variables.YearNumber = Evaluate(DatePart("yyyy",variables.rekendatum)+1) />
</cfif>
</cfcase>
<cfcase value="4">
<cfset variables.WeekNumber = variables.WeekNumber-1 />
<cfif variables.WeekNumber IS 0>
<cfset variables.WeekNumber = 53 />
<cfset variables.YearNumber = Evaluate(DatePart("yyyy",variables.rekendatum)-1) />
</cfif>
</cfcase>
<cfcase value="5">
<cfset variables.WeekNumber=variables.WeekNumber-1 />
<cfif variables.WeekNumber IS 0>
<cfif IsLeapYear(DatePart("yyyy",variables.rekendatum)-1)>
<cfset variables.WeekNumber = 53 />
<cfset variables.YearNumber = Evaluate(DatePart("yyyy",variables.rekendatum)-1) />
<cfelse>
<cfset variables.WeekNumber = 52 />
<cfset variables.YearNumber = Evaluate(DatePart("yyyy",variables.rekendatum)-1) />
</cfif>
</cfif>
</cfcase>
<cfcase value="6">
<cfset variables.WeekNumber = variables.WeekNumber-1 />
<cfif variables.WeekNumber IS 0>
<cfset variables.WeekNumber = 52 />
<cfset variables.YearNumber = Evaluate(DatePart("yyyy",variables.rekendatum)-1) />
</cfif>
</cfcase>
<cfdefaultcase>
<cfif variables.WeekNumber IS 53>
<cfset variables.WeekNumber = 1 />
</cfif>
</cfdefaultcase>
</cfswitch>
<!--- Nu moet ik nog weten welke dag van de week het is --->
<cfset variables.dag_van_de_week = Dayofweek(variables.rekendatum) />
<!--- Corrigeer deze dag van de week i.v.m. maffe Amerikanen --->
<cfswitch expression="#variables.dag_van_de_week#">
<cfcase value="1"><cfset variables.dag_van_de_week = 7 /></cfcase>
<cfcase value="2"><cfset variables.dag_van_de_week = 1 /></cfcase>
<cfcase value="3"><cfset variables.dag_van_de_week = 2 /></cfcase>
<cfcase value="4"><cfset variables.dag_van_de_week = 3 /></cfcase>
<cfcase value="5"><cfset variables.dag_van_de_week = 4 /></cfcase>
<cfcase value="6"><cfset variables.dag_van_de_week = 5 /></cfcase>
<cfcase value="7"><cfset variables.dag_van_de_week = 6 /></cfcase>
</cfswitch>

<!--- Nu nog de gegevens wegschrijven in de tabel --->
<cfquery datasource="#application.datasource#" name="qryInsert">
INSERT INTO FRZ_weeknummer
( fwe_jaar
, fwe_week
, fwe_datum
, fwe_dag
, fwe_uuid )
VALUES ( #variables.YearNumber#
, #variables.weeknumber#
, #variables.rekendatum#
, #variables.dag_van_de_week#
, '#CreateUUID()#' )
</cfquery>
</cfloop>

En voila. Het resultaat is een tabel die gevuld is met alle dagen inclusief een vermelding van het weeknummer, het jaarnummer en de hoeveelste dag van de week het is.

Over Morloff

Morloff ontwerpt en realiseert succesvolle webtoepassingen op het gebied van procesoptimalisatie, eCommerce en rapportage door de inzet van moderne webtechnieken, sociale media en zoekmachine optimalisatie.

over ons | diensten | portfolio | contact | route

naar website IJsmonster.nl naar website ICT intermediairs naar website marcelvanlangen.com

Twitter

Morloff

Cuneraweg 169a
3911 RH Rhenen

M +31 (0)6 - 515 96 189
W www.morloff.nl
E contactformulier

Morloff op Twitter Morloff op Facebook Morloff op LinkedIn Morloff via RSS