![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: How can I generate a weeknumber? Is this by using the lexical function f$time or f$cvtime? The Answer is : By week number, the OpenVMS Wizard will assume you mean the week within the year, and specifically a value between 1 and 52 inclusive. As there are various accepted definitions for a week number, there is no single DCL lexical function or argument that can retrieve the desired. Given that there are only 52 weeks in a year, and given that DCL is not particularly suited for date arithmetic, and given that computers are fast, the simplest way to is to count the week. For example, assuming that week 1 starts on 1-Jan and week 2 starts on 8-Jan (etc...), this procedure uses combination times to count backwards in multiples of 7 to find the first day not in the current year, at the same time as counting up weeks. $ day=F$CVTIME(p1,"ABSOLUTE","DATE") $ weeknum=0 $ offset=0 $ year=F$CVTIME(day,,"YEAR") $ loop: $ weeknum=weeknum+1 $ offset=offset+7 $ IF F$CVTIME("''day'-''offset'-0",,"YEAR").EQS.Year THEN GOTO loop $ WRITE SYS$OUTPUT weeknum $ EXIT Minor variations can be made to this procedure to accomodate other definitions for week number. Remember that in the worst case, the above procedure will loop for 53 iterations, so unless your code is highly performance sensitive, it shouldn't be a problem. If your code is performance sensitive, please create and code an algorthm using a compiled language. Within a compiled language, you can generate the weeknumber for any given date. For example, you can generate the week number for any given date using the strftime() C Run-time library function, and specifically the %W directive. This will give you a week number in the range [00,53], where Monday is the first day of the week. For the purposes of this C example, all days in the year preceding the first Monday are considered to be in week 0. For example, for current date: $ run x $ Monday May 06 2002 is in week number 18 $ x.c --- #include <time.h> #include <stdio.h> main() { char s[80]; time_t t = time(NULL); struct tm *tms = localtime(&t); strftime(s, sizeof(s), "%A %B %d %Y is in week number %W", tms); puts(s); }
|