` Printed Icetips Article

Icetips Article



Par2: Week of year
2001-01-17 -- Kevin Dunsford
 
Note  - this does not use Mod because its origins were in Clarion 2003 where
% did not always work correctly. It is now for C5. It takes into
consisderations the requirements of ISO 2051.

Kevin


   MEMBER('qse.clw')                                  ! This is a MEMBER
module

                     MAP
                       INCLUDE('QSE098.INC'),ONCE        !Local module
prodecure declarations
                     END


FWeekNumber          PROCEDURE  ( Pdate )             ! Declare Procedure
loc:Resultstr string(7)  ! Returned Result = 'YYYYWWW'
Loc:Result   Long       ! Returned as a long
loc:date     Long       ! Day of year in Clarion standard date form.
loc:Year     Long       ! Long  Year that the week belongs to - Passed by
Reference


loc:aMonday      byte(1)    ! First day of the first week of year = Monday
loc:aThursday    byte(4)    ! Day number for thursday

loc:WeekNo       Long       ! Week no of loc:Year returned. Note: loc:Year
may be
                        ! either the year of the date, the previous year or
the next year

loc:Week1Date    Long       ! Calculated date of first week of current year
loc:PrevWeek1    Long       ! Previous year week 1 date
loc:NextWeek1    Long       ! Next Year week 1 date

  CODE
             ! PROC YEARWEEK
             !    For a given date - returns the Year and week number of the
year
             !    in a 7 digitstring YYYYWWW all places significant.
             !    Note, the Year is a 4 digit year that the week is in
             !    according to ISO 2051 where the first week of the year
must contain 4
             !    or more days of that year.
             !    IE: The first thursday in the new year is in the first
week of the year.
             !        The week begins on the monday preceeding that first
thursday which
             !        may be either in the current year or previous year.
             !
             !    NOTE: The year in YYYYWWW may be different from the date
year!!!

             ! Note the week value may be from 1 to 53.
             !      ie: a week may span the year end and is allocated to
which
             !      ever year 4 or more of its days occur in.
             ! Refer Croxley Publishing tel: 828-7169.
             ! ---------

             If    | USE TODAY'S DATE
                   ( Not pdate )
                   loc:date = Today()

             else  ! DATE PASSED
                   Loc:Date = pDate
             end   ! Pos todays date

             Loc:Year = Year(loc:Date)

             ! Calculate Week 1 date for current year

             loc:Week1Date = Date(1,1,Year(loc:date) ) ! CURRENT YEAR

             Loop ! FIRST THURSDAY IN YEAR
                  If loc:Week1Date - ( Int(loc:Week1Date/7) * 7) =
loc:aThursday then break.
                  loc:Week1Date += 1
             end  ! First Thursday

             loc:Week1Date -= 3 ! Previous Monday

             ! Calculate Week 1 date for Previous year
             loc:PrevWeek1 = Date(1,1,Year(loc:date)-1 )

             Loop ! FIRST THURSDAY IN YEAR
                  If loc:PrevWeek1 - ( Int(loc:PrevWeek1/7) * 7) =
loc:aThursday then break.
                  loc:PrevWeek1 += 1
             end  ! First Thursday
             loc:PrevWeek1 -= 3 ! Previous Monday

            ! Calculate Week 1 date for Next year
             loc:NextWeek1 = Date(1,1,Year(loc:date)+1 )
             Loop ! FIRST THURSDAY IN YEAR
                  If loc:NextWeek1 - ( Int(loc:NextWeek1/7) * 7) =
loc:aThursday then break.
                  loc:NextWeek1 += 1
             end  ! First Thursday
             loc:NextWeek1 -= 3 ! Previous Monday


             If     | DATE IN PREVIOUS YEAR
                    ( loc:date < loc:Week1Date )
                    loc:Year = Year(loc:date) - 1
                    loc:WeekNo = INT( (loc:date - loc:PrevWeek1 ) / 7 ) + 1

             elsif  | DATE IN NEXT YEAR
                    ( loc:date >= loc:NextWeek1 )
                    loc:Year = Year(loc:date) + 1
                    loc:WeekNo = INT( (loc:date - loc:NextWeek1 ) / 7 ) + 1

             else   ! DATE IS IN CURRENT YEAR
                    loc:Year = Year(loc:date)
                    loc:WeekNo = INT( (loc:date - loc:Week1Date ) / 7 ) + 1
             end  ! Year

             loc:ResultStr = Format( loc:Year,@n_04 ) &
Format(loc:WeekNo,@n_03)
             If clip(Loc:ResultStr) <> '' then Loc:Result = Loc:ResultStr
else Loc:Result = 0.

             return( loc:Result  ) ! ---------------------------------------



Printed May 6, 2024, 12:03 am
This article has been viewed/printed 35119 times.