Skip to main content
Inspiring
October 28, 2011
Question

Week function gives wrong result for last week in year

  • October 28, 2011
  • 2 replies
  • 1189 views

Week(CreateDate(2011,12,25)) returns 51 - correct

Week(CreateDate(2011,12,26)) returns 53 - wrong

It looks like all last weeks of the year are 53 whereas the next year with 53 weeks should be 2015.

See http://tuxgraphics.org/toolbox/calendar.html for example.

I am running CF9 on Windows 7 with Java V6 update 29.

This is causing me a problem. Any ideas for a workaround?

Doug

    This topic has been closed for replies.

    2 replies

    doug777Author
    Inspiring
    October 31, 2011

    Here is my general solution for my cfc which seems to work for all dates up to 2100 at least.

    Hope it can help if you need a Week function to replace the CF one.

    <cffunction name="getISOWeekNum" access="public" returntype="Numeric" hint="Gets ISO week number in which date occurs.">

        <cfargument name="date" type="date" required="true" hint="Date for which you wish to know the week number">

        <cfset var weeknum = 0>

        <cfset var isLeap = isLeapYear(Year(date))>

        <cfset var dayInWeek = dayOfWeek(date)>

        <cfset var isoDayOfWeek = iIf(dayInWeek GT 1, dayInWeek - 1, 7)>

        <cfset var nearestThur = dateAdd("d", 4 - isoDayOfWeek, date)>

        <cfset var fourthDayOfYear = createDate(year(nearestThur), 1, 4)>

        <cfset var fourthDayInWeek = dayOfWeek(fourthDayOfYear)>

        <cfset var fourthIsoDayOfWeek = iif(fourthDayInWeek GT 1, fourthDayInWeek - 1, 7)>

        <cfset var firstThur = dateAdd("d", 4 - fourthIsoDayOfWeek, fourthDayOfYear)>

        <cfset var lastWeek = iIf(fourthDayInWeek EQ 8 OR (isLeap AND fourthDayInWeek EQ 7), 53, 52)>

        <cfset var firstIsoDayOfFirstWeek = dateAdd("d", -(fourthIsoDayOfWeek-1), fourthDayOfYear)>

        <cfset var firstIsoDayOfLastWeek = dateAdd("d", -7, firstIsoDayOfFirstWeek)>

        <cfset var lastIsoDayOfFirstWeek = dateAdd("d", 6, firstIsoDayOfFirstWeek)>

        <cfset var weekDiff = iIf(dateCompare(date, firstIsoDayOfFirstWeek, "d") EQ -1, 0, 1)>

        <cfif dateCompare(date, firstIsoDayOfFirstWeek, "d") EQ -1 AND dateCompare(date, firstIsoDayOfLastWeek, "d") NEQ -1>

            <cfset weeknum = lastWeek>

        <cfelseif dateCompare(date, lastIsoDayOfFirstWeek, "d") NEQ 1 AND dateCompare(date, firstIsoDayOfLastWeek, "d") NEQ -1>

            <cfset weeknum = 1>

        <cfelse>

            <cfset weeknum = weekDiff + (dateDiff("d", firstThur, nearestThur) / 7)>

        </cfif>

        <cfreturn weeknum>

    </cffunction>

    Doug

    Inspiring
    October 28, 2011

    Yeah, it's a known bug:

    http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=80754

    To work around, use Java:

    <cfscript>

        oCalXmas = createObject("java", "java.util.GregorianCalendar").init(2011,11,25);

        writeOutput("Xmas day: #oCalXmas.get(oCalXmas.WEEK_OF_YEAR)#<br />");

        oCalBoxingDay = createObject("java", "java.util.GregorianCalendar").init(2011,11,26);

        writeOutput("Boxing day: #oCalBoxingDay.get(oCalBoxingDay.WEEK_OF_YEAR)#<br />");

    </cfscript>

    You might wanna go vote for the bug, too.

    --

    Adam