HP OpenVMS Systems

ask the wizard
Content starts here

DCL and Julian Dates?

» close window

The Question is:

I like to run a batch job Friday every four weeks.  I would submit a job
 whenever i=0;
i = mod((N-n),28)
where N is today's Julian calander day dount,
n is the Julian calendar day count of the first friday.
How can I get the Julian calenday day count form the MVS time and is there a
 DCL modulo operator?

The Answer is :

  DCL does not have particularly elegant mechanisms for manipulating
  dates and date values -- it is often easiest to submit the job more
  often than it is needed, and have the job detect and exit (after
  immediately resubmitting itself for the next interval via, say,
  $ SUBMIT/AFTER="+28-") when the job is not needed.  This means that
  a natch job that is self-resubmitted daily (SUBMIT/AFTER=TOMORROW)
  can perform one set of actions on most days, and can be coded to
  perform another set of tasks on a specific day of the week (or
  month, etc).
  For a tool that directly works with the Julian day (via the lib$day
  RTL call and DCL symbols), please see the DSBD tools in the area:
  Look in the SRH_EXAMPLES area available on several of the Freeware
  If you have a scheduled daily batch job, and want to determine the
  day number in the current year, then you could use a DCL sequence
  such as the following:
  $ if p1 .eqs. ""
  $ then
  $   now = f$time()
  $ else
  $   now = p1
  $ endif
  $ month= f$integer(f$cvtime(now,,"MONTH"))
  $ year = f$integer(f$cvtime(now,,"YEAR"))
  $ if f$integer(f$cvtime("28-FEB-''year'+1-",,"MONTH")) .eq. 2
  $ then
  $  ! Specified date is a leap year...
  $  days="0,0,31,60,91,121,152,182,213,244,274,305,335"
  $ else
  $  ! Specified date is NOT a leap year...
  $  days="0,0,31,59,90,120,151,181,212,243,273,304,334"
  $ endif
  $ julianday = f$integer(f$element(month,",",days))
  $ julianday = julianday + f$integer(f$cvtime(p1,,"DAY"))
  $ show symbol julianday
  Note that:
  $ if f$integer(f$cvtime("28-FEB-''year'+1-",,"MONTH")) .eq. 2
  can be shortened to:
  $ if f$integer(f$cvtime("28-FEB-''year'+1-",,"MONTH"))
  Now as to why this particular command and this command construct will
  work in this context, that is left up to the reader.

answer written or last revised on ( 18-JUN-2004 )

» close window