home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / VRAC / FDATE82A.ZIP / FDATE.DOC < prev    next >
Text File  |  1993-08-15  |  107KB  |  2,788 lines

  1. FDATE                     Version 8.2a               August 13, 1993
  2. ======================================================================
  3. AUTHOR:     Stephen Ferg             
  4.             5113 N. 8th Road
  5.             Arlington, VA 22205-1201
  6.             USA
  7.                          telephone (voice, not FAX): (703) 525-2241
  8.                          CompuServe ID             : 73377,1157
  9. =======================================================================
  10.  
  11.  
  12.  
  13.                              Table of Contents
  14.  
  15. Page numbers in the WordPerfect version of FDATE.DOC (which is not
  16. distributed with FDATE) are lost in the conversion to ASCII format. 
  17. Nevertheless, these page numbers give you a rough idea of the relative
  18. locations of the different sections.
  19.  
  20.   WHAT IS FDATE?. . . . . . . . . . . . . . . . . . . . . . . . . . . .   3
  21.      OTHER UTILITIES NAMED "FDATE". . . . . . . . . . . . . . . . . . .   3
  22.      OVERVIEW OF PARAMETERS . . . . . . . . . . . . . . . . . . . . . .   4
  23.      OVERVIEW OF FUNCTIONS. . . . . . . . . . . . . . . . . . . . . . .   6
  24.   FUNCTIONS: DETAILED DESCRIPTIONS. . . . . . . . . . . . . . . . . . .   8
  25.      DATE FORMATTING FUNCTIONS. . . . . . . . . . . . . . . . . . . . .   8
  26.      DATE ARITHMETIC FUNCTIONS. . . . . . . . . . . . . . . . . . . . .   9
  27.      MONTH DATE ARITHMETIC FUNCTIONS. . . . . . . . . . . . . . . . . .  10
  28.      WEEKDAY DATE ARITHMETIC FUNCTIONS. . . . . . . . . . . . . . . . .  11
  29.      DATE/TIME COMPARISON FUNCTIONS . . . . . . . . . . . . . . . . . .  12
  30.      NUMERIC ARITHMETIC FUNCTIONS . . . . . . . . . . . . . . . . . . .  13
  31.      DATE VALIDATION FUNCTION . . . . . . . . . . . . . . . . . . . . .  15
  32.      ECHO FUNCTION. . . . . . . . . . . . . . . . . . . . . . . . . . .  16
  33.   DATE FORMATS. . . . . . . . . . . . . . . . . . . . . . . . . . . . .  17
  34.      SYMBOL CONVENTIONS . . . . . . . . . . . . . . . . . . . . . . . .  17
  35.      PSEUDODATES. . . . . . . . . . . . . . . . . . . . . . . . . . . .  18
  36.   INPUT DATE FORMATS. . . . . . . . . . . . . . . . . . . . . . . . . .  19
  37.      CALENDAR DATE INPUT FORMATS. . . . . . . . . . . . . . . . . . . .  19
  38.      BUSINESS JULIAN DATE INPUT FORMATS . . . . . . . . . . . . . . . .  20
  39.      GETTING DATE/TIME A FILE WAS CREATED . . . . . . . . . . . . . . .  21
  40.   OUTPUT DATE FORMATS . . . . . . . . . . . . . . . . . . . . . . . . .  22
  41.      DAY-OF-WEEK AND MONTH OUTPUT FORMATS . . . . . . . . . . . . . . .  23
  42.      MISCELLANEOUS OUTPUT FORMATS . . . . . . . . . . . . . . . . . . .  23
  43.      LEAP-YEAR FLAG OUTPUT FORMAT . . . . . . . . . . . . . . . . . . .  24
  44.      TIME OUTPUT FORMATS. . . . . . . . . . . . . . . . . . . . . . . .  24
  45.      BUSINESS JULIAN DATE OUTPUT FORMATS. . . . . . . . . . . . . . . .  25
  46.      ABSOLUTE DATE/TIME OUTPUT FORMATS. . . . . . . . . . . . . . . . .  26
  47.      /T: TIME OVERRIDE PARAMETER. . . . . . . . . . . . . . . . . . . .  27
  48.   HOW TO PUT FDATE OUTPUT INTO AN ENVIRONMENT VARIABLE. . . . . . . . .  28
  49.      CALL A BATCH FILE. . . . . . . . . . . . . . . . . . . . . . . . .  28
  50.      USE AN ENVIRONMENT-MANIPULATION UTILITY. . . . . . . . . . . . . .  28
  51.      FDATE'S /V PARAMETER . . . . . . . . . . . . . . . . . . . . . . .  29
  52.      /V WHEN USING 4DOS, NDOS, AND UMB. . . . . . . . . . . . . . . . .  30
  53.   FDATE'S ERROR HANDLING. . . . . . . . . . . . . . . . . . . . . . . .  31
  54.   EXAMPLES OF HOW TO USE FDATE. . . . . . . . . . . . . . . . . . . . .  32
  55.      :01 Display Fdate output on screen . . . . . . . . . . . . . . . .  32
  56.      :02 Redirect FDATE output to a file. . . . . . . . . . . . . . . .  32
  57.      :03 Put FDATE output in an environment variable using a batch file  32
  58.      :04 Put FDATE output in an environment variable using /V parm. . .  32
  59.      :05 Put FDATE output in an environment variable using STRINGS. . .  32
  60.      :06 Put FDATE output in an environment variable using GET. . . . .  32
  61.      :07 Change a date from one format into another . . . . . . . . . .  32
  62.      :11 Find the difference in days between two dates. . . . . . . . .  33
  63.      :12 Find the elapsed days/hours/minutes between two date/times . .  33
  64.      :13 Time the execution of a piece of software. . . . . . . . . . .  35
  65.      :15 Find calendar date corresponding to a "business Julian" date .  37
  66.      :16 Set your PC's date to a business julian date . . . . . . . . .  38
  67.      :18 Determine if parm %1 contains a valid date . . . . . . . . . .  40
  68.      :19 "Roll your own" date format  . . . . . . . . . . . . . . . . .  41
  69.      :20 Find the 4th Thursday in November (Thanksgiving) . . . . . . .  41
  70.      :22 On a date, show what anniversary it is for some event. . . . .  41
  71.      :23 Show a list of holidays in a given year. . . . . . . . . . . .  41
  72.      :24 Show a list of Federal holidays in a given year. . . . . . . .  41
  73.      :25 Determine if a year is valid, and evenly divisible by 4. . . .  42
  74.      :30 Compare a file's date to today's date. . . . . . . . . . . . .  42
  75.      :32 Display a list of all files that were created/updated today. .  43
  76.      :33 Delete files more than X days old (use a batch-file subroutine) 44
  77.      :34 Loop through an array of environment variables . . . . . . . .  49
  78.      :44 Do something on the last day (or last Friday) of the month . .  50
  79.      :45 Get information about the month prior to the current month . .  51
  80.      :51 Represent a date in a short (4-byte) format (technique #1) . .  52
  81.      :52 Represent a date in a short (4-byte) format (technique #2) . .  53
  82.      :53 SetXX.BAT (used in the previous example) . . . . . . . . . . .  55
  83.      :54 Customize Fdate for a language of your choice. . . . . . . . .  57
  84.      :55 Fergian.BAT (used in the previous example) . . . . . . . . . .  58
  85.      :61 DO-ONCE: Run apps when booting for the first time of the day .  60
  86.      :62a Run specific software, depending on the day of the week . . .  61
  87.      :62b Run specific software, depending on the day of the week . . .  62
  88.      :63 Run a program at a specified time later in the day . . . . . .  62
  89.      :67 Change a file's name to a name that contains today's date. . .  63
  90.      :68 Change a file's name to a name containing an absolute minute .  63
  91.   HOW FDATE THINKS ABOUT DATES. . . . . . . . . . . . . . . . . . . . .  64
  92.      FDATE'S BUSINESS VIEW OF THE CALENDAR. . . . . . . . . . . . . . .  64
  93.      FDATE'S BASE DATE. . . . . . . . . . . . . . . . . . . . . . . . .  64
  94.      FDATE'S LEAP YEAR ALGORITHM. . . . . . . . . . . . . . . . . . . .  65
  95.      FDATE'S CENTURY-ASSUMPTION ALGORITHM . . . . . . . . . . . . . . .  66
  96.      FDATE'S IMPLEMENTATION LIMITS. . . . . . . . . . . . . . . . . . .  66
  97.   DISTRIBUTION ISSUES . . . . . . . . . . . . . . . . . . . . . . . . .  67
  98.      USE, REGISTRATION, AND DISTRIBUTION OF FDATE . . . . . . . . . . .  67
  99.      TECHNICAL SUPPORT FOR FDATE. . . . . . . . . . . . . . . . . . . .  68
  100.      WHERE TO FIND THE MOST CURRENT VERSION OF FDATE. . . . . . . . . .  68
  101.      UPLOADING FDATE TO ELECTRONIC BULLETIN BOARDS. . . . . . . . . . .  68
  102.      DEMONSTRATION BATCH FILES. . . . . . . . . . . . . . . . . . . . .  68
  103.      CONTENTS OF THE FDATE.ZIP DISTRIBUTION FILE. . . . . . . . . . . .  68
  104.      FDATE REVISION HISTORY . . . . . . . . . . . . . . . . . . . . . .  69
  105.  
  106. WHAT IS FDATE?
  107. ==============
  108.  
  109. Fdate is a utility for doing date formatting and date arithmetic in DOS
  110. batch files.  There are a number of different ways to put FDATE's output
  111. into environment variables.  Once this has been done, the environment
  112. variables can be used and manipulated in many ways in the batch file.
  113.  
  114. FDATE is freeware, or what is technically known as "zero-cost shareware". 
  115. There is no requirement to register FDATE in any way.  For more details,
  116. see the DISTRIBUTION ISSUES section.
  117.  
  118. Here are some of the things you can do with FDATE.
  119.  
  120.     retrieve today's date in a variety of formats
  121.       place today's date into a file name
  122.  
  123.     reformat dates 
  124.        Output formats include common American and European formats, or you
  125.        can "roll your own" by manipulating environment variables.  Month
  126.        and weekday names can be produced in several languages (English,
  127.        French, German, Spanish).
  128.  
  129.     calculate when certain holidays occur in a given year
  130.  
  131.     do date arithmetic
  132.       determine the date N days before/after a given date
  133.       compare two dates to determine which is earlier
  134.       compare two dates to determine how many days apart they are
  135.  
  136.     determine if a year is a leap year
  137.     determine whether a year is evenly divisible by some number
  138.  
  139.     determine what day of the week a date falls on
  140.       run certain software only on certain days of the week
  141.  
  142.     retrieve the date/time from the date/timestamp of a file
  143.     do simple integer arithmetic (add, subtract, modulus)
  144.     calculate the time a piece of software takes to run
  145.     convert a calendar date to/from a "business julian" date
  146.  
  147.  
  148.  
  149. OTHER UTILITIES NAMED "FDATE"
  150. =============================
  151. I recently learned that there is another shareware utility named FDATE in
  152. circulation.  It is an implementation of the UNIX "touch" utility, and is
  153. used to change the date/time stamp of a file.  
  154.  
  155. Both FDATEs have been in circulation for too long to make it practical to
  156. change the name of either one.  All that can be done is to warn you of a
  157. potentially confusing situation.
  158.  
  159. OVERVIEW OF PARAMETERS
  160. ======================
  161.  
  162. FDATE accepts the following parameters:
  163.  
  164.        /F /A /B /I /O /P /S /N /D /L /V /T
  165.  
  166.  
  167. The only parameter that FDATE requires is the function parameter: /F.
  168.  
  169. If the /F parameter is not present, FDATE displays a help screen.  
  170.      If you get FDATE's help screen when you don't expect it, you probably
  171.      forgot to specify the /F parameter or mistyped it.
  172.  
  173. Parameters can be in any order and upper or lower case.
  174.      Note that although function and format parms are not case sensitive,
  175.      they are "text sensitive".  If any characters are missing, added, or
  176.      mistyped, the parameter will be rejected.
  177.  
  178. Parameters -- other than /F -- that are required depend on the function
  179. requested with the /F parameter.  Unnecessary parameters are simply
  180. ignored.
  181.  
  182.  
  183.  
  184. The next page contains a brief description of what each of the parameters
  185. means.
  186.  
  187. /F   requests a particular FDATE function.  This is Fdate's most important
  188.      parameter.  See the OVERVIEW OF FUNCTIONS section, and the detailed
  189.      description of each Fdate function.
  190.  
  191. /N   number of days (always a number)
  192.  
  193. /D   day-of-week number (used only with W function)
  194.  
  195. /A   
  196. /B   For date functions, these two parameters are used to specify dates. 
  197.      For the ordinary arithmetic functions, these parameters are used to
  198.      specify numbers.  For date functions, if either of these parameters is
  199.      omitted, it defaults to today's date.
  200.  
  201. /T   For date functions, /T overrides the time portion of the date on the
  202.      /A parm. (Note that it does NOT override the time portion of the date
  203.      on the /B parm.)  
  204.  
  205. /I   specifies format of input date(s)
  206.      If the /I parameter is omitted, /Imm-dd-ccyy is assumed.
  207.  
  208. /O   specifies format of output date
  209.      If the /O parameter is omitted, /Od1 is assumed.
  210.  
  211. /L  specifies language of output.
  212.      /Lus   US (American) English-language output
  213.      /Lfr   French-language output
  214.      /Lgr   German-language output
  215.      /Lsp   Spanish-language output
  216.      If the /L parameter is omitted, /Lus [American English] is assumed.
  217.  
  218. /V   specifies that output is to be placed in an environment variable
  219.      rather than written to standard output.
  220.      If /V is specified but not followed by the name of an environment
  221.      variable, then /Vfdate is assumed, and output is placed in the FDATE
  222.      environment variable.
  223.  
  224. /P  specifies a prefix string for the output
  225. /S  specifies a suffix string for the output
  226.     These optional parameters may always be specified or omitted.
  227.     They must be enclosed in single quotes, double quotes, or
  228.                   square brackets
  229.  
  230.     Note that "whitespace" will be removed from these strings,
  231.     so formatting of /P and /S strings cannot be controlled using
  232.     spaces.  To format strings, use periods or ASCII 255 (hex'ff')
  233.     as filler.
  234.  
  235.     EXAMPLES
  236.     FDATE /Ff                /P"Today is "
  237.     FDATE /Fdif /B12-25-TTTT /P"It is " /S" days until Christmas"
  238.  
  239. OVERVIEW OF FUNCTIONS
  240. =====================
  241.  
  242. Fdate's most important parameter, and the only one for which there is no
  243. default value, is the function parameter, /F.  Here is a brief summary of
  244. the functions that may be specified on the /F parm, for example: /Fadd. 
  245. Detailed descriptions of each of the functions can be found on the next few
  246. pages.
  247.  
  248. f         Format the date in the /A parm into the format specified in the
  249.           /O parm
  250.  
  251. add       Add the number of days in the /N parm to the date in the /A parm
  252.  
  253. sub       Subtract the number of days in the /N parm from the date in the
  254.           /A parm
  255.  
  256. m         Monthly arithmetic.  Add the number of months in the /N parm to
  257.           the date in the /A parm.  /N may be a negative number.
  258.  
  259. dif       Return the number of days between dates in the /A and /B parms
  260.  
  261. w         Do date arithmetic in terms of weeks rather than days.  Using the
  262.           date in the /A parm, a number specified in the /N parm, and a
  263.           day-of-the-week number specified in the /D parm, return the date
  264.           of the /Nth /Day-of-the-week before (or after) /Adate.  
  265.  
  266. e         Echo the strings on the /P and /S parameters.
  267.  
  268.  
  269.  
  270.           DATE/TIME COMPARISON FUNCTIONS
  271.  
  272. comp      Compare the dates in the /A and /B parms. Return LT, EQ, or GT.
  273.  
  274. tcomp     Compare the times specified on the /A and /B parms.
  275.  
  276.  
  277.  
  278.           ORDINARY (AS OPPOSED TO DATE) ARITHMETIC FUNCTIONS
  279.  
  280.           Functions whose names begin with "#" do ordinary arithmetic, i.e.
  281.           arithmetic on numbers rather than dates.
  282.  
  283. #add      Add the integers specified on the /A and /B parms.  To do
  284.           subtraction, add a negative number to a positive number.
  285.  
  286. #dif      returns the difference between the integers specified on the /A
  287.           and /B parms. 
  288.  
  289. #comp     Compare the integers specified on the /A and /B parms.  Return
  290.           LT, EQ, or GT.
  291.  
  292. #mod      Modulus.  Divide the integer on the /A parm by the integer on the
  293.           /B parm, and return the remainder.  
  294.  
  295. #mult     Multiply the integer on the /A parm by the integer on the /B
  296.           parm, and return the result.
  297.  
  298. #div      Divide the integer on the /A parm by the integer on the /B parm,
  299.           and return the result as a decimal number with two decimal
  300.           places.
  301.  
  302. #idiv     Integer division. Divide the integer on the /A parm by the
  303.           integer on the /B parm, and return the result as an integer.
  304.  
  305. FUNCTIONS: DETAILED DESCRIPTIONS
  306. ================================
  307.  
  308.  
  309. DATE FORMATTING FUNCTIONS
  310. =========================
  311.  
  312. FUNCTION  FDATE /Ffunc /Adate /Iformat /Oformat
  313. --------  -------------------------------------------
  314. format    this is a synonym for function "f"
  315.  
  316. f         returns /Adate in format specified by /Oformat
  317.           Since /Aformat and /Oformat can be different, the FORMAT
  318.           function is used to change a date from one format to another.
  319.           Because of the wide variety of output formats, the FORMAT
  320.           function can also be used to determine the day of week of the
  321.           date, whether the date is in a normal or leap year, etc.
  322.  
  323. EXAMPLES
  324.           FDATE /Ff /A19920101 /Iccyymmdd /O"mn zd, ccyy"
  325.           FDATE /Ff       /Atoday         /Od1
  326.           FDATE /Fformat  /Atoday         /Od1
  327.           FDATE /Ff /If /Afdate.exe /P"FDATE.EXE last updated: " /Ofull
  328.  
  329. DATE ARITHMETIC FUNCTIONS
  330. =========================
  331.  
  332. Internally, numbers in Fdate are stored in Turbo Pascal's LONGINT datatype,
  333. which means that Fdate can accept numbers up to 9 digits long.
  334.  
  335. FUNCTION  FDATE /Ffunc /Nnumdays /Adate /Iformat /Oformat
  336. --------  -------------------------------------------
  337. add       Adds      /Ndays to   /Adate, produces date in /Oformat format
  338. sub       Subtracts /Ndays from /Adate, produces date in /Oformat format
  339.  
  340.           EXAMPLES
  341.           FDATE /Fadd /N90 /A01-01-1992 /Imm-dd-ccyy /Od1
  342.           FDATE /Fsub /N90 /A01-01-1992 /Imm-dd-ccyy /Od1
  343.           FDATE /Fadd /N90 /Atoday                   /Od1
  344.  
  345. dif       Returns number of days between /Adate and /Bdate
  346.           Order of the two dates is not significant.
  347.  
  348.           NOTE THAT:
  349.           For DIF, both dates must be in the SAME format, the input format
  350.           specified in /Iformat.  If the two dates are not in the same
  351.           format, you must first reformat one of the dates using the /Ff
  352.           function, then use DIF to get their difference.
  353.  
  354.           EXAMPLES
  355.           FDATE /Fdif /A01-01-1992 /B11-11-1992  /Imm-dd-ccyy
  356.           FDATE /Fdif /A11-11-1992 /B01-01-1992  /Imm-dd-ccyy
  357.           FDATE /Fdif /Atoday      /B01-01-1992  /Imm-dd-ccyy
  358.  
  359. MONTH DATE ARITHMETIC FUNCTIONS
  360. ===============================
  361.  
  362. FUNCTION  FDATE /Ffunc /Nnumdays /Adate /Iformat /Oformat
  363. --------  -------------------------------------------
  364. m         Adds /N months to /Adate, produces date in /Oformat format.  This
  365.           function can also be used to do monthly subtraction by making the
  366.           number in the /N parameter a negative number.
  367.  
  368.           EXAMPLES
  369.  
  370.           FDATE /Fm /N1  /A03-15-1992 /Imm-dd-ccyy /Omm-dd-ccyy
  371.                   produces:   04-15-1992
  372.  
  373.           FDATE /Fm /N-1 /A03-30-1991 /Imm-dd-ccyy /Omm-dd-ccyy
  374.                   produces:   02-28-1991
  375.  
  376.           FDATE /Fm /N-1 /A03-30-1992 /Imm-dd-ccyy /Omm-dd-ccyy
  377.                   produces:   02-29-1992
  378.  
  379.  
  380.           Note that a too-simple algorithm for month arithmetic can produce
  381.           non-existent dates.  Subtracting a month from March 30, 1991 (as
  382.           in the second example) could produce a result of February 30,
  383.           1991, a date which cannot exist.  
  384.  
  385.           Fdate's month arithmetic is more sophisticated than that.  If
  386.           Fdate finds that a simple month-arithmetic operation produces an
  387.           invalid date, it subtracts the minimum number of days required to
  388.           produce a valid date.  
  389.  
  390.           Thus, in the second example, it produces February 28, 1991, the
  391.           last date in February, 1991.  In the third example, it produces
  392.           February 29, 1992 because 1992 is a leap year.  
  393.  
  394.  
  395. Note that telling Fdate to add 12 months to February 29, 1992 produces a
  396. result of February 28, 1993, since 1993 is not a leap year.  See Peter G.
  397. Neumann's INSIDE RISKS column in COMMUNICATIONS OF THE ACM, June 1992 (Vol.
  398. 35, No. 6), entitled "Leap-Year Problems":
  399.  
  400.   Prime Computer's MAGSAV failed at midnight [on Feb 29, 1992]...  G. M.
  401.   Lack noted that MAGSAV probably failed on leap-day because it tried to
  402.   increment the year by one to set a tape label expiration date, and the
  403.   resulting nonexistent date of Feb 29, 1993 threw it for a loop.
  404.  
  405. WEEKDAY DATE ARITHMETIC FUNCTIONS
  406. =================================
  407.  
  408. FUNCTION  FDATE /Ffunc /Adate /Iformat /Oformat /Ddow#  /Ndow-count
  409. --------  -----------------------------------------------------------
  410. w         This function provides a way of doing date arithmetic in terms of
  411.           weeks rather than days.
  412.  
  413.           This function accepts a date specification in parm /A and
  414.           returns the date of the /Nth /Day-of-the-week
  415.           before or after /Adate.  For example:
  416.  
  417.           If    /A specifies November 14, 1992
  418.                 /D specifies the number for Thursday (i.e., 5)
  419.                 /N specifies a week count of 3
  420.           then /Fw returns the date of the third Thursday after
  421.           November 14, 1992. (See full example, below)
  422.  
  423.           Note that /N may be negative.  If, in the above example, /N
  424.           is specified as -3, then Fdate returns the date of the third
  425.           Thursday BEFORE November 14, 1992.
  426.  
  427.           If the date specified on the /A parms falls on the same day
  428.           of the week as was specified on the /D parm, then that will
  429.           be considered to be the first date meeting that day-of-week
  430.           criterion.  That is, if November 14, 1992 fell on a
  431.           Thursday, and if /N was 1 or -1, then the output date would
  432.           be the same as the input date, i.e.  November 14, 1992.
  433.  
  434.           The acceptable values for /N (number of weeks) is in
  435.           the range of 99..-99.  A value of zero (i.e. /N0) is invalid.
  436.  
  437. EXAMPLES
  438.      find date of Thanksgiving (4th Thursday in November) in 1992
  439.          FDATE /Fw /A11-01-1992 /Imm-dd-ccyy /D5 /N4 /Od1
  440.      returns: Thursday November 26, 1992
  441.  
  442.      find the beginning of the work-week (Monday, 2nd day of week)
  443.      AFTER Thanksgiving, 1992
  444.          FDATE /Fw /A11-26-1992 /Imm-dd-ccyy /D2 /N1 /Od1
  445.  
  446.      find the beginning of the work-week (Monday, 2nd day of week)
  447.      BEFORE Thanksgiving, 1992
  448.          FDATE /Fw /A11-26-1992 /Imm-dd-ccyy /D2 /N-1 /Od1
  449.  
  450.      get last Friday's date
  451.         rem Find next Friday's date (or today's date, if today is Friday).
  452.         rem Then find the Friday that precedes that Friday.
  453.         FDATE /Fw /At     /Omm-dd-ccyy  /D6 /N+1  /VGET
  454.         FDATE /Fw /A%GET% /Imm-dd-ccyy  /D6 /N-2  /VGET
  455.         Echo Last Friday was %GET%
  456.  
  457. DATE/TIME COMPARISON FUNCTIONS
  458. ==============================
  459.  
  460. FUNCTION  FDATE /Ffunc /Adate /Bdate /Iformat
  461. --------  -------------------------------------------
  462. comp      compares the dates (time granularity = 1 day)
  463.           specified on the /A and /B parms.
  464.           returns         when
  465.             LT            /A  is less than    (earlier than) /B
  466.             EQ            /A  is equal to     (same as)      /B
  467.             GT            /A  is greater than (later than)   /B
  468.  
  469. tcomp     compares the times (time granularity = 1 second)
  470.           specified on the /A and /B parms.
  471.           This is useful when input format /If (file) is specified.
  472.           It can be used to compare the timestamps of two files and
  473.           determine which is older.
  474.               EXAMPLE: Fdate /Ftcomp /If /Amyfile.1 /Byourfile.1
  475.  
  476.           returns         when
  477.             LT            /A  is less than    (earlier than) /B
  478.             EQ            /A  is equal to     (same as)      /B
  479.             GT            /A  is greater than (later than)   /B
  480.  
  481. NUMERIC ARITHMETIC FUNCTIONS
  482. ============================
  483.  
  484. Note that all of Fdate's arithmetic functions operate on integers.  A
  485. decimal number on an input parameter will be rejected, and an error message
  486. will be displayed.
  487.  
  488. FUNCTION  FDATE /Ffunc /Anum  /Bnum
  489. --------  -------------------------------------------
  490.  
  491. #add      returns the sum of the integers specified
  492.           on the /A and /B parms.  Can be used to calculate the
  493.           "absolute" minute(second, date) in the future from a given
  494.           "absolute" minute(second, date).   Also useful in generating
  495.           sequences of numbers and looping (see EXAMPLES).
  496.  
  497. #sub      (not supported)
  498.           Fdate does not provide a numeric subtraction operation as such. 
  499.           To do subtraction, add two numbers, one of which is a negative
  500.           number.  For example, to subtract 3 from 2:
  501.               FDATE /F#add /A2 /B-3          [ returns: -1 ]
  502.  
  503. #dif      returns the difference between the integers specified on the /A
  504.           and /B parms.  #dif is the same as subtraction in which the
  505.           smaller number is subtracted from the larger number; it will
  506.           never return a negative number.  It can be used to calculate the
  507.           number of minutes(seconds, days) between two
  508.           "Absolute"  minutes(seconds, dates).
  509.  
  510. #comp     compares the integers specified on the /A and /B parms.
  511.           returns         when
  512.             LT            /A  is less    than /B
  513.             EQ            /A  is equal   to   /B
  514.             GT            /A  is greater than /B
  515.  
  516. #mod      divides the integer on the /A parm by the integer on the /B parm,
  517.           and returns the remainder.  
  518.  
  519.           This is useful for determining whether a number is evenly
  520.           divisible by some other number.  If the remainder is 0, then /A
  521.           is evenly divisible by /B.  If a year is evenly divisible by 4,
  522.           for example, then it is an American election year.  If it is
  523.           evenly divisible by 100, then it is a century year, etc.
  524.  
  525.  
  526. #mult     multiplies the integer on the /A parm by the integer on the /B
  527.           parm, and returns the result.
  528.  
  529. #div      (division) divides the integer on the /A parm by the integer on
  530.           the /B parm, and returns the result as a decimal number, with two
  531.           digits to the right of the decimal.
  532.  
  533.           This is useful for dividing a number (representing the number of
  534.           minutes in some period) by 60 to get the length of the period
  535.           expressed in terms of hours, or by 1440 to get the length of the
  536.           period expressed in terms of days.  Or you could divide a number
  537.           of days by 7 to get the number of weeks, etc.
  538.  
  539.  
  540. #idiv     (integer division) divides the integer on the /A parm by the
  541.           integer on the /B parm, and returns the result as an integer.
  542.  
  543.           This is useful, especially in conjunction with the #mod function,
  544.           for converting a number of minutes into a number of hours and
  545.           minutes, or days and hours and minutes.  See the EXAMPLES
  546.           section, below.
  547.  
  548. DATE VALIDATION FUNCTION
  549. ========================
  550.  
  551. v    If the date specified on the /A parm is valid, produces "" (the null
  552.      string).  Otherwise, produces "ERROR" and a non-zero errorlevel by
  553.      triggering Fdate's error-handling function.  (See the section on
  554.      FDATE'S ERROR HANDLING, later in this documentation.)
  555.  
  556.      When processing an input date, Fdate does not reject all invalid
  557.      dates: specifically, it is very forgiving about the number in the day-
  558.      of-the-month part of input dates.  It will accept, for example,
  559.      19931144 (November 44, 1993 in CCYYMMDD format) and process it quite
  560.      happily (as December 14, 1993).  This is not a bug, it is a feature. 
  561.      This feature provides one way (admittedly a crude one) of doing date
  562.      arithmetic.  The date part (JJJ) of a Business Julian input date can
  563.      be used in the same way.  
  564.  
  565.      This feature can be a drawback, however, if you want to be sure that
  566.      some date (say a date that a user entered as an input parameter) is
  567.      valid.  The /Fv function provides a way of completely checking a date
  568.      for validity.  It will, for example, reject November 44, 1993 as
  569.      invalid. 
  570.  
  571.  
  572.  
  573. ECHO FUNCTION
  574. =============
  575.  
  576. e         Produces only the strings specified using the /P and /S
  577.           parameters.
  578.  
  579. You can use /Fe for situations in which you want Fdate to produce output
  580. that doesn't include any sort of date.  In these cases, Fdate functions
  581. just like the DOS "echo" command.  
  582.  
  583. The real use for /Fe is in conjunction with /V, where it can be used to
  584. manipulate the environment in ways that DOS's SET command cannot:
  585.  
  586.   (1)  to give a value to an environment variable that it would not accept
  587.        from the SET command (e.g. a value that contained "=").
  588.  
  589.   (2)  to redirect or pipe a character-string that contains a redirection
  590.        symbol ">" or pipe symbol "|".
  591.  
  592. This feature is for real batch-file power users.
  593.  
  594.  
  595.  
  596. EXAMPLE BATCH FILE
  597. ------------------
  598.   @ECHO OFF
  599.   set pct=%%%
  600.   Fdate /Fe /P"=Sam=" /vName
  601.   Fdate /Fe /P"echo ECHO Hi, %pct%Name%pct%!>junk2.bat">junk1.bat
  602.      :  RESULT: TEXT OF JUNK1.BAT IS
  603.      :          echo ECHO Hi, %Name%!>junk2.bat
  604.   call junk1.bat
  605.      :  RESULT: TEXT OF JUNK2.BAT IS
  606.      :          ECHO Hi, =Sam=!
  607.   call junk2.bat
  608.      :  RESULT: TEXT DISPLAYED ON SCREEN IS
  609.      :          Hi, =Sam=!
  610.   :endit
  611.  
  612.  
  613. DATE FORMATS
  614. ============
  615.  
  616. SYMBOL CONVENTIONS
  617. ==================
  618.  
  619. The following symbols are used in specifying date formats:
  620.  
  621. SYMBOL  EXAMPLE   MEANING
  622. ------  -------   -------------------------------------
  623. cc        19      century
  624. yy        93      year
  625. mm        02      month
  626. zm         2      month without leading zero
  627. dd        08      day
  628. zd         8      day   without leading zero
  629. mn       February month name
  630. mn3      Feb      month name, first 3 characters only
  631. dow      Tuesday  day of week
  632. dow3     Tue      day of week, first 3 characters only
  633. dow#      3       day of week as a number (Sunday=1, Monday = 2, etc.)
  634. today             is a "pseudodate" representing the current date
  635. t                 is an alias for the "today" pseudodate
  636. hh:mm    09:05    hours and minutes
  637. hhmm     0905     hours and minutes
  638. ss        13      seconds
  639.  
  640.  
  641.  
  642. PSEUDODATES
  643. ===========
  644.  
  645. t (or today)
  646.           can be used with either /A or /B, e.g. /Atoday or /At.
  647.           This is the default for both /A and /B.  That is, if /A is not
  648.           specified, /At is assumed, and the same for /B.
  649.  
  650.           NOTE THAT
  651.           "Today" as a date specification operates independently of any
  652.           input format.  You need to specify an input format (either
  653.           explicitly via the /I parameter, or implicitly by accepting the
  654.           default value of /I) only for input dates that are supplied to
  655.           Fdate in some other way than via the "today" pseudodate: as a
  656.           date literal, a filename, etc.
  657.  
  658. EXAMPLES:
  659.           rem Get the date that is 90 days from today
  660.           FDATE /Fadd /N90 /Atoday /Omm-dd-ccyy
  661.           FDATE /Fadd /N90 /At     /Omm-dd-ccyy
  662.  
  663.           rem determine if this year is a leapyear
  664.           FDATE /Ff /At /OLY
  665.  
  666.  
  667.  
  668.  
  669. tttt      When used in place of a 4-digit CCYY string, "tttt"
  670.           will cause Fdate to use today's 4-digit year (CCYY).
  671.  
  672. tt        When used in place of a 2-digit DD, MM, or YY string,
  673.           "tt" will cause Fdate to use today's day-of-the-month,
  674.           month, or 2-digit year, respectively.
  675.  
  676.           Note that "tt" can NOT be used for the YY portion of a CCYY
  677.           input year.  The following, for example, is NOT valid:
  678.                FDATE /Ff /Imm-dd-ccyy /A01-01-19tt /Od1
  679.  
  680. EXAMPLES:
  681.  
  682.      FDATE /Ff /Imm-dd-ccyy /A01-01-tttt
  683.      FDATE /Ff /Imm-dd-yy   /A01-01-tt 
  684.  
  685.      rem report the 15th day of this month, this year
  686.      FDATE /Ff /Imm-dd-ccyy /Att-15-tttt
  687.  
  688.      rem Show the first Monday in the second quarter of this year
  689.      FDATE /Fw /Iccyymmdd /Atttt0401 /D2 /N1  /P"First Monday in QTR#2: "
  690.  
  691.      rem Show the last Friday on/before the 15th of this month.
  692.      FDATE /Fw /Iccyymmdd /Atttttt15 /D6 /N-1 /P"Friday before the 15th: "
  693.  
  694.  
  695. INPUT DATE FORMATS
  696. ==================
  697.  
  698.  
  699. CALENDAR DATE INPUT FORMATS
  700. ===========================
  701.  
  702. FORMAT      EXAMPLES      DISCUSSION
  703. ------      ---------     -----------------------------
  704. ccyymmdd    19922002  
  705.  
  706.  
  707. On the /I (input format) parm, the separator character of the following
  708. input formats must be a dash.  This simply tells Fdate that the input
  709. date will contain SOME separator character.  The separator character that
  710. actually occurs in dates in the /A and /B parms is ignored, and may be
  711. any non-numeric character: a slash "/", a dash "-", a dot ".", etc.
  712.  
  713. In specifications that begin with "mm-dd" or "dd-mm", leading zeros need
  714. not be present in the "mm" and "dd" part of the date.
  715.  
  716. ccyy-mm-dd  1992-02-20    Leading zeros MUST be present, since the
  717.             1992/02/20    date does not begin with dd-mm or mm-dd.    
  718.             1992.02.20    
  719.  
  720.  
  721. mm-dd-ccyy  02-20-1992    
  722.             02/20/1992    The dash represents ANY non-numeric character.
  723.  
  724.              2-5-1992     Leading zeros need not be present.
  725.              2/5/1992
  726.  
  727. mm-dd-yy    02-05-92      February 5, 1992.  See discussion of
  728.              2/5/92       FDATE'S CENTURY ASSUMPTION ALGORITHM, below
  729.  
  730.                           ---------------------------------------
  731.                           In the following formats, days
  732.                           precede months  (European style)
  733.                           ---------------------------------------
  734.  
  735. dd-mm-ccyy  05-02-1992 
  736.             05/02/1992 
  737.  
  738.              5-2-1992     Leading zeros need not be present.
  739.              5/2/1992
  740.  
  741. dd-mm-yy    05-02-92      February 5, 1992.  See discussion of
  742.              5/2/92       FDATE'S CENTURY ASSUMPTION ALGORITHM, below
  743.  
  744. BUSINESS JULIAN DATE INPUT FORMATS
  745. ==================================
  746.  
  747. These are formats for "business julian" dates: dates expressed as the
  748. number of days from the beginning of the year, when January 1 is day 1.
  749.  
  750. EXAMPLES:
  751.  
  752.       date      BUSINESS JULIAN DATE
  753.   -----------   --------------------
  754.   Jan  5, 1992  92005
  755.   Jan  5, 1993  93005
  756.   Dec 31, 1993  93365  [Dec 31 is 365th day of year 1993]
  757.   Dec 31, 1996  96366  [Dec 31 is 366th day, because 1996 is a leap year]
  758.  
  759. -----------------------------------------------------------------------
  760. NOTE:   * JJJ can be 1 - 4 digits
  761.         * may include a prefix of a plus or minus ( + or - ) sign
  762. -----------------------------------------------------------------------
  763.  
  764. FORMAT      EXAMPLES      DISCUSSION
  765. ------      ---------     -----------------------------
  766. ccyyjjj     1992003       Third day of 1992, i.e. Jan 3, 1992
  767.             19923         Third day of 1992
  768.             tttt003       Third day of this year
  769.             tttt3         Third day of this year
  770.  
  771.   yyjjj       92003       Third day of 1992
  772.               923         Third day of 1992
  773.               tt003       Third day of this year
  774.               tt3         Third day of this year
  775.               01003       Third day of 2001           See
  776.                           FDATE'S CENTURY ASSUMPTION ALGORITHM, below
  777.  
  778. NOTE THAT FDATE WILL ACCEPT "JJJ" OF LESS THAN 1 & MORE THAN 366.
  779. -----------------------------------------------------------------
  780.  
  781.   yyjjj       tt1000      the 1000th day from beginning of this year
  782.               tt0         last day of last year
  783.               tt-1        next-to-last day of last year
  784.  
  785. FDATE /Ff /Iccyyjjj /Od1 /A1992-1  produces... Monday December 30, 1991
  786. FDATE /Ff /Iccyyjjj /Od1 /A19920   produces... Tuesday December 31, 1991
  787. FDATE /Ff /Iccyyjjj /Od1 /A1992+1  produces... Wednesday January 1, 1992
  788.  
  789. FDATE /Ff /Iccyyjjj /Od1 /A1992366 produces... Thursday December 31, 1992
  790. FDATE /Ff /Iccyyjjj /Od1 /A1992367 produces... Friday January 1, 1993
  791.  
  792. This feature allows limited date arithmetic with ordinary business
  793. Julian days.  For example, 90 days from tt300 can be shown by:
  794.  
  795.                   FDATE /Ff /Iyyjjj /Att390
  796.  
  797. GETTING DATE/TIME A FILE WAS CREATED
  798. ====================================
  799.  
  800. FORMAT      EXAMPLES      DISCUSSION
  801. ------      ---------     -----------------------------
  802. f           MYFILE.1      Input format F (file) tells Fdate that
  803.                           /A and /B will specify filenames, and that
  804.                           Fdate should pick up the input date and time
  805.                           from the date/time stamp on a file.
  806.  
  807.      Note that if you specify /If, then both /A and /B will be interpreted
  808.      as filenames.
  809.  
  810.      It is not possible to put a filename in /A and a date literal in /B,
  811.      and then use the "comp" or "dif" function to compare them.  You must
  812.      first extract the file's date into an environment variable, and then
  813.      compare that environment variable to the date literal.
  814.  
  815.           The only exception to this rule is the pseudodate "t" (i.e. /At
  816.           or /Bt) which will pick up the current date and time from the
  817.           system clock.  This feature will allow you, for example, to
  818.           compare the date of a file to today's date (see EXAMPLES).
  819.  
  820.      A filename may (but need not) be fully qualified: i.e. "MYFILE.1" and
  821.      "C:\DBASE\WORKDIR\MYFILE.1" are both acceptable.
  822.  
  823.      A filename may contain wildcards.  If it does, the date/time stamp
  824.      will be retrieved from the first file that FDATE finds that meets the
  825.      filespec.  Giving FDATE a filespec containing a wildcard is pretty
  826.      useless, but FDATE will not reject it.
  827.  
  828. OUTPUT DATE FORMATS
  829. ===================
  830.  
  831. FORMAT        EXAMPLES      DISCUSSION
  832. ------        ---------     -----------------------------
  833. dd-mn3-yy     08-Feb-92     CompuServe-style date
  834.   yy            93          2-digit year number
  835. ccyy          1993          4-digit year number (includes century)
  836. ccyymm        199302        useful for triggering monthly processing
  837. ccyymmdd      19930208      useful for putting current date in filename
  838.   yymmdd        908208      useful for putting current date in filename
  839.     mmdd          0208
  840.       mm            02      2-digit month number
  841.       zm             2      month number, no leading zeros
  842.       dd            08      2-digit day-of-month number
  843.       zd             8      day-of-month number, no leading zeros
  844.  
  845. In the following formats, months precede days (American style)
  846. ------------------------------------------------------------------
  847. mm/dd/ccyy    02/08/1993
  848. mm-dd-ccyy    02-08-1993
  849. mm.dd.ccyy    02.08.1993    British-style dates
  850.  
  851. zm/zd/ccyy     2/8/1993     no leading zeros in day or month
  852. zm-zd-ccyy     2-8-1993     no leading zeros in day or month
  853. zm.zd.ccyy     2.8.1993     British-style dates
  854.  
  855. mm/dd/yy      02/08/92
  856. mm-dd-yy      02-08-92
  857. mm.dd.yy      02.08.92      British-style dates
  858.  
  859. zm/zd/yy       2/8/92       no leading zeros in day or month
  860. zm-zd-yy       2-8-92       no leading zeros in day or month
  861. zm.zd.yy       2.8.92       no leading zeros in day or month
  862.  
  863. In the following formats, days precede months  (European style)
  864. ------------------------------------------------------------------
  865. dd/mm/ccyy    02/08/1993
  866. dd-mm-ccyy    02-08-1993
  867. dd.mm.ccyy    02.08.1993    British-style dates
  868.  
  869. zd/zm/ccyy     2/8/1993     no leading zeros in day or month
  870. zd-zm-ccyy     2-8-1993     no leading zeros in day or month
  871. zd.zm.ccyy     2.8.1993     British-style dates
  872.  
  873. dd/mm/yy      02/08/92
  874. dd-mm-yy      02-08-92
  875. dd.mm.yy      02.08.92      British-style dates
  876.  
  877. zd/zm/yy       2/8/92       no leading zeros in day or month
  878. zd-zm-yy       2-8-92       no leading zeros in day or month
  879. zd.zm.yy       2.8.92       British-style dates
  880.  
  881. DAY-OF-WEEK AND MONTH OUTPUT FORMATS
  882. ====================================
  883.  
  884. dow#           5            Sunday=1, Monday=2 .... Saturday=7.
  885.  
  886. dow            Thursday     name of day of week
  887.                jeudi        if /Lfr specified
  888.                Donnerstag   if /Lgr specified
  889.  
  890. dow3           Thu          first 3 characters of name of day of week
  891.                jeu          if /Lfr specified
  892.                Don          if /Lgr specified
  893.  
  894. mn             February     name of month
  895.                fevrier      if /Lfr specified
  896.                Februar      if /Lgr specified
  897.  
  898. mn3            Feb          first 3 characters of name of month
  899.                fev          if /Lfr specified
  900.                Feb          if /Lgr specified
  901.  
  902.  
  903.  
  904.  
  905.  
  906. MISCELLANEOUS OUTPUT FORMATS
  907. ============================
  908.  
  909. full          9:05 pm on Wednesday February 5, 1992
  910.               9:05 pm, mercredi le 5 fevrier 1992  [/Lfr specified]
  911.               9:05 pm, miércoles el 5 de febrero de 1992 [/Lsp specified]
  912.               Mittwoch, 5. Februar 1992, 21:05     [/Lgr specified]
  913.  
  914. d1            Saturday, February 5, 1992
  915.               samedi le 5 fevrier 1992      [/Lfr specified]
  916.               Mittwoch, 5. Februar 1992     [/Lgr specified]
  917.  
  918. ddmn3yy       05Feb92
  919.  
  920. -----------------------------------------------------------------------
  921. NOTE that the following formats contain embedded spaces.  Consequently
  922. they must be enclosed in double quotes. EXAMPLE: /O"mn zd, ccyy".
  923. -----------------------------------------------------------------------
  924. "zd mn ccyy"      5 February 1992
  925. "zd mn, ccyy"     5 February, 1992
  926. "zd. mn ccyy"     5. February 1992   [German-style date format]
  927. "zd. mn3 ccyy"    5. Feb 1992        [German-style date format]
  928. "mn3 dd ccyy"     Feb 05 1992
  929. "mn3 dd, ccyy"    Feb 05, 1992
  930. "mn zd, ccyy"     February 5, 1992
  931.  
  932.  
  933.  
  934. LEAP-YEAR FLAG OUTPUT FORMAT
  935. ============================
  936.  
  937. LY              0     "1" if date occurs in a leapyear, otherwise "0".
  938.  
  939.                  365 + this number gives total number of days in the year.
  940.                   28 + this number gives total number of days in February.
  941.  
  942.  
  943.  
  944.  
  945. TIME OUTPUT FORMATS
  946. ===================
  947. See also: the section on the /T (parm /A time override) parameter.
  948.  
  949. t1            9:05 am
  950.               9:05 pm
  951.  
  952. HH:MM        09:05      24-hour time, hours:minutes
  953.              21:05
  954. HHMM         0905
  955.              2105
  956.  
  957. HH:MM:SS     21:05:30   24-hour time, hours:minutes:seconds
  958. HHMMSS       210530
  959.  
  960.  
  961. BUSINESS JULIAN DATE OUTPUT FORMATS
  962. ===================================
  963.  
  964. These are formats for "business julian" dates: dates expressed as the
  965. number of days from the beginning of the year, when January 1 is day 1.
  966.  
  967. EXAMPLES:
  968.  
  969.       DATE      BUSINESS JULIAN DATE
  970.   -----------   --------------------
  971.   Jan  5, 1993  93005
  972.   Dec 31, 1993  93365  [Dec 31 is 365th day of year 1993]
  973.   Dec 31, 1996  96366  [Dec 31 is 366th day, because 1996 is a leap year]
  974.  
  975.  
  976. FORMAT        EXAMPLES      DISCUSSION
  977. ------        ---------     -----------------------------
  978.  
  979. ccyyjjj       1992027       Jan 27, 1992
  980.   yyjjj         92027       "Business Julian" date expressed as number
  981.     jjj           027       of days since January 1 of the same year.
  982.     zzj            27       Note leading zero suppression in "zzj".
  983.  
  984.  
  985. ABSOLUTE DATE/TIME OUTPUT FORMATS
  986. =================================
  987. See also: the section on the /T (parm /A time override) parameter.
  988.  
  989.  
  990. day#           727198       "Absolute date": date expressed as number
  991.                             of days since January 1, 0001.
  992.  
  993. minute#         33088       "Absolute minutes": time expressed as number
  994.                             of minutes  since midnight, January 1, 1990.
  995.  
  996. second#        633088       "Absolute seconds": time expressed as number
  997.                             of seconds  since midnight, January 1, 1990.
  998.  
  999.  
  1000. Running FDATE with /O parameter for an "absolute time" produces a
  1001. number based on the current time of day and the date in the /A parm.
  1002.  
  1003. If, on January 10, 1992 at 2 pm, you run FDATE this way:
  1004.        FDATE /Ff /Atoday /Ominute#
  1005. it will produce the absolute minute for January 10, 1992 at 2 pm.
  1006.  
  1007. If, on January 10, 1992 at 2 pm, you run FDATE this way:
  1008.        FDATE /Ff /A01-15-1992 /Imm-dd-ccyy  /Ominute#
  1009. it will produce the absolute minute for January 15, 1992 at 2 pm.
  1010.  
  1011.  
  1012. /T: TIME OVERRIDE PARAMETER
  1013. ===============================
  1014.  
  1015. You may override Fdate's use of the current time -- for the /A parameter
  1016. only -- by using the /T parameter.  The /T parameter specifies a time of
  1017. day in the 24-hour format hh:mm:ss (hours:minutes:seconds).  Leading zeros
  1018. in each of the three fields (hh, mm, ss) may be omitted.  The seconds field
  1019. may be omitted; if omitted, it defaults to "00".
  1020.  
  1021. Note that the /T parm overrides the time portion of the /A date, but it
  1022. does NOT override the time portion of the /B date.
  1023.  
  1024. If, on January 10, 1992 at 2 pm, you run FDATE this way:
  1025.        FDATE /Ff /A01-15-1992 /Imm-dd-ccyy  /Ominute#  /T5:12
  1026. it will produce the absolute minute for January 15, 1992 at 5:12 am.
  1027.  
  1028. The most frequent and important use of the /T parm is with the format
  1029. function (/Ff) to obtain the "absolute" minute of a specific date and time. 
  1030. Once we have the absolute minutes of two different date/times, we can
  1031. easily obtain the time between them (expressed in days, hours, and minutes)
  1032. by using Fdate's #dif, #idiv, and #mod functions.  (In the EXAMPLES
  1033. section, see the example that contains FORATIME.BAT.)
  1034.  
  1035. It is also possible to use /T in conjunction with the time compare function
  1036. (/Ftcomp).
  1037.  
  1038. @echo ON
  1039. cls
  1040. rem  Since both /A and /B default to the current date and time,
  1041. rem  and since /T parm overrides the time only for the /A parm ...
  1042.  
  1043. rem   ... during daytime hours, this will always return LT
  1044. Fdate /ftcomp /T00:00:00
  1045. rem   ... during daytime hours, this will always return GT
  1046. Fdate /ftcomp /T23:59:59
  1047.  
  1048.  
  1049. HOW TO PUT FDATE OUTPUT INTO AN ENVIRONMENT VARIABLE
  1050. ====================================================
  1051.  
  1052.  
  1053. CALL A BATCH FILE
  1054. =================
  1055.  
  1056.   The most basic way to put FDATE's output into an environment variable is
  1057.   to:
  1058.   *  use the /P (prefix string) feature to create a DOS "SET" statement,
  1059.   *  redirect the output to a batch file, and then
  1060.   *  CALL the batch file.  
  1061.  
  1062.   Since CALL first appeared in DOS 3.3, you will need DOS 3.3 or greater
  1063.   to use this technique.
  1064.  
  1065.        FDATE /Ff /Atoday /O"mn zd, ccyy" /P"@SET FDATE=" >JUNKTEMP.BAT
  1066.        call JUNKTEMP.BAT
  1067.        del  JUNKTEMP.BAT
  1068.  
  1069.  
  1070.  
  1071. USE AN ENVIRONMENT-MANIPULATION UTILITY
  1072. =======================================
  1073.  
  1074.   There are shareware and public domain utilities that are written
  1075.   specifically to manipulate environment variables, and do that job very
  1076.   well.  FDATE's output can be put into an environment variable by piping
  1077.   it to one of these utilities.  When piping FDATE output to a utility,
  1078.   you can prevent the output from being ECHOed to the screen by
  1079.   redirecting the output to NUL.
  1080.  
  1081.   Of these utilities, I can especially recommend Bob Stephan's GET
  1082.   (because it is very powerful and flexible) and PC Magazine's STRINGS
  1083.   (because it is free to ZiffNet members).  See the EXAMPLES section for
  1084.   examples of how to use STRINGS and GET to put FDATE's output into an
  1085.   environment variable.
  1086.  
  1087.      As of February 14, 1992, the current version of GET is 2.5.  On
  1088.      CompuServe, use IBMFF to look for GET*.ZIP (e.g. GET25.ZIP for version
  1089.      2.5) in CIS:IBMSYS, or for GET.ZIP in ZNT:UTILFORUM, lib 16.  GET is
  1090.      also available from the Public Software Library in Houston.
  1091.  
  1092.      As of February 14, 1992, the current version of STRINGS is 1.3. On
  1093.      CompuServe, look for STRING.ZIP in the PC Magazine Utilities Lib of
  1094.      ZNT:UTILFORUM.  STRHYP.ZIP contains good hypertext documentation on
  1095.      STRINGS.
  1096.  
  1097.  
  1098. FDATE'S /V PARAMETER
  1099. ====================
  1100.  
  1101.   Manipulating the environment is an incredibly tricky business.  There
  1102.   are questions of the local versus master environment, the version of DOS
  1103.   you are running, and the environment under which you are running (DOS,
  1104.   Windows, Carousel).  In order to keep FDATE focussed on date-related
  1105.   issues, versions of Fdate prior to 6.1 did not attempt to put output
  1106.   directly into an environment variable.  Instead, FDATE's output was
  1107.   written to standard output, that is, it was displayed on the screen.
  1108.   Output could then be redirected to a batch file, or piped to a utility
  1109.   (such as STRINGS or GET), that would put the output into an environment
  1110.   variable.
  1111.  
  1112.   Starting with version 6.1, Fdate supports a /V (environment variable)
  1113.   parameter.  A user can use /V to tell Fdate to put its output directly
  1114.   into an environment variable. (Fdate attempts to put output into an
  1115.   environment variable in the master, rather than the local, environment.)
  1116.  
  1117.   NOTE that due to the complexities of manipulating the environment, there
  1118.   may be circumstances where /V doesn't work.  These include running FDATE
  1119.   when you have shelled out to DOS from another program, have put the
  1120.   command processor in upper memory (UMB) (see below), are running under
  1121.   Windows, Carousel, etc.  In such cases, you may be able to use one of
  1122.   the more basic techniques described above.  For a list of environments
  1123.   in which the /V option has been reported as NOT working, see the next
  1124.   section.
  1125.  
  1126.  
  1127.  
  1128.   /Vevar tells Fdate to put output into an environmental variable whose
  1129.   name is "evar".  For example:
  1130.  
  1131.                 Fdate /Ff /Vdate1
  1132.  
  1133.   will set the environment variable DATE1 to the current date.  If you
  1134.   type SET at the DOS prompt, you should see something like:
  1135.  
  1136.                 DATE1=Friday February 14, 1992
  1137.  
  1138.   If you specify /V without an evar name, the evar name defaults to FDATE.
  1139.  
  1140.      Example :       Fdate /Ff /V
  1141.      produces:       FDATE=Friday February 14, 1992
  1142.  
  1143.   If you do not use /V, Fdate output is written to standard output, i.e.
  1144.   to the screen.
  1145.  
  1146. /V WHEN USING 4DOS, NDOS, AND UMB
  1147. =================================
  1148.     --------------------------------------------------------------
  1149.     I have received the following report from Aran Spence about
  1150.     circumstances in which FDATE /V will not set a variable
  1151.     in the master environment.  This report leads me to believe
  1152.     that FDATE /V may also fail to work with MS-DOS if you put
  1153.     the command processor or the environment in Upper Memory.
  1154.     --------------------------------------------------------------
  1155. Steve,
  1156.  
  1157. There are options with 4DOS and NDOS to load the environment and part
  1158. of the command processor into upper memory blocks.  When one of these
  1159. options is used, FDATE /V can't find the environment and produces the
  1160. message:
  1161.  
  1162.    ERROR
  1163.    echo ERROR: Master environment not found
  1164.    pause
  1165.  
  1166. If you have a 4DOS.INI file, it has to contain these lines for FDATE /V
  1167. to work:
  1168.  
  1169.    UMBEnvironment = No
  1170.    UMBLoad = No
  1171.  
  1172. If you have NDOS, the SHELL statement in CONFIG.SYS cannot contain
  1173. any reference to UMB loading via /U (which puts NDOS.COM in UMB), nor
  1174. can it contain a statement of the form:
  1175.                 /E:xxxU
  1176. (which puts xxx bytes of the environment in UMB via the "U" parameter).
  1177.  
  1178. Also, NSTART.BTM or 4START.BTM cannot contain
  1179.          SET NDSHELL=/e+xxxU /U
  1180. in which both U's represent UMB loading of the command processor and the
  1181. environment during secondary shells.
  1182.  
  1183. FDATE'S ERROR HANDLING
  1184. ======================
  1185.  
  1186.    If FDATE detects an error:
  1187.  
  1188.      (1) it will return an errorlevel of 1 (rather than 0), and
  1189.      (2) its output will be 3 lines:
  1190.        * the word ERROR
  1191.        * a DOS batch-file ECHO statement that displays an error message
  1192.        * a DOS batch-file PAUSE statement
  1193.  
  1194.    If Fdate output is displayed directly, or redirected to NUL,
  1195.    you can detect an error by testing the errorlevel for a value of 1.
  1196.  
  1197.    If Fdate output is piped to an environment manipulation utility such
  1198.    as STRINGS or GET, the environment variable will be set to ERROR.
  1199.    Errorlevel will be set by STRINGS/GET, and will probably be 0.
  1200.    In such a case, the only way to detect an error is to test the
  1201.    environment variable for the value ERROR.
  1202.  
  1203.    If FDATE output is redirected to a batch file, which is then
  1204.    CALLed to set an environment variable, the batch file will:
  1205.      * set the environment variable to ERROR,
  1206.      * ECHO the error message, and
  1207.      * pause.
  1208.    You can detect an error by testing errorlevel for the value 1
  1209.    either before or after you CALL the batch file, or 
  1210.    by testing the environment variable for the
  1211.    value ERROR, AFTER you have CALLed the batch file.
  1212.  
  1213. ----------------------------------------------------------------------
  1214.  
  1215.  EXAMPLE:
  1216.    rem use FDATE to check validity of year in parm %1
  1217.    Fdate /Fv /Imm-dd-ccyy /ATT-TT-%1 > nul
  1218.    if errorlevel 1 echo Year parm [%1] is not valid.
  1219.    if errorlevel 1 goto endit
  1220.  
  1221.  EXAMPLE:
  1222.    rem use FDATE to validate %1, and GET to put it into %year%
  1223.    Fdate /Ff /Imm-dd-ccyy /ATT-TT-%1 /Occyy | GET ZE /V%year% >nul
  1224.    if (%year%)==(ERROR) echo Year parm [%1] is not valid.
  1225.    if (%year%)==(ERROR) goto endit
  1226.  
  1227.  EXAMPLE:
  1228.    rem use FDATE to validate %1, call a batch file to put it into %year%
  1229.    Fdate /Ff /Imm-dd-ccyy /ATT-TT-%1 /Occyy /P"@set year=">junktemp.bat
  1230.    call junktemp.bat
  1231.    del  junktemp.bat
  1232.    if errorlevel 1 echo Year parm [%1] is not valid.
  1233.    if errorlevel 1 goto endit
  1234.  
  1235. EXAMPLES OF HOW TO USE FDATE
  1236. ============================
  1237.  
  1238. :01 Display Fdate output on screen
  1239. :==================================================================
  1240. FDATE /Ff /At /Od1 /P"Today is "
  1241.  
  1242.  
  1243. :02 Redirect FDATE output to a file
  1244. :==================================================================
  1245. FDATE /Ff /At /Od1 /P"Today is " >FDATE.OUT
  1246.  
  1247.  
  1248. :03 Put FDATE output in an environment variable using a batch file
  1249. :==================================================================
  1250. FDATE /Ff /Atoday /O"mn zd, ccyy" /P"@SET DATE1=" >JUNKTEMP.BAT
  1251. call JUNKTEMP.BAT
  1252. del  JUNKTEMP.BAT
  1253.  
  1254.  
  1255. :04 Put FDATE output in an environment variable using /V parm
  1256. :==================================================================
  1257. FDATE /Ff /Atoday /O"mn zd, ccyy" /Vdate1
  1258.  
  1259.  
  1260. :05 Put FDATE output in an environment variable using STRINGS
  1261. :==================================================================
  1262. FDATE /Ff /Atoday /O"mn zd, ccyy" |STRINGS date1= ASK >NUL
  1263.  
  1264.  
  1265. :06 Put FDATE output in an environment variable using GET
  1266. :==================================================================
  1267. FDATE /Ff /Atoday /O"mn zd, ccyy" |GET ZE /Vdate1 >NUL
  1268.  
  1269.  
  1270. :07 Change a date from one format into another
  1271. :==================================================================
  1272. FDATE /Ff /Imm-dd-yy /A05-08-92 /Occyymmdd
  1273.  
  1274.  
  1275. :11 Find the difference in days between two dates
  1276. :==================================================================
  1277. FDATE /Fdif /Imm-dd-ccyy /A%date1% /B%date2% /vdiff
  1278. echo The difference is %diff% days.
  1279.  
  1280.  
  1281.  
  1282.  
  1283. :12 Find the elapsed days/hours/minutes between two date/times.
  1284. :===================================================================
  1285. This batch file was developed in cooperation with Walter Ledge, a sysop for
  1286. CompuServe's CRFORUM.  In addition to being a good example of how to use
  1287. Fdate's /T parm and "#idiv" function, it should be useful for other
  1288. CompuServe sysops who need to submit the same reports that Walt does. 
  1289. Here's Walt's message that started the whole thing.
  1290.  
  1291.   As an assistant sysop on the CRFORUM, I have to submit reports to CIS on
  1292.   the number of messages that are posted on our forum in terms of time per
  1293.   1,000 messages -- i.e., say, I know that 1,000 messages were posted
  1294.   between the hours of 17:05 on July 5 and 3:03 on July 7.  I need to know
  1295.   how many hours and minutes it took for those 1000 messages to be posted. 
  1296.   So I would like some way to use FDATE to calculate the difference
  1297.   between those two times (which, of course, include the dates).
  1298.  
  1299. @echo off
  1300. cls
  1301. rem ------------------------------------------------------
  1302. rem FORATIME.BAT batch file parms
  1303. rem Dates must include full 4-digit for year: mm-dd-ccyy
  1304. rem Times must be in 24-hour format: hh:mm 
  1305. rem ------------------------------------------------------
  1306. set BEGdate=%1
  1307. set BEGtime=%2
  1308. set ENDdate=%3
  1309. set ENDtime=%4
  1310.  
  1311. ECHO Validating input parms ...
  1312. fdate /fv /A%BEGdate% /T%BEGtime%
  1313. if errorlevel 1 goto endit
  1314. fdate /fv /A%ENDdate% /T%ENDtime%
  1315. if errorlevel 1 goto endit
  1316.  
  1317. rem get absolute minute of start date/time
  1318. fdate /ff /ominute# /A%BEGdate% /T%BEGtime% /VABStime1
  1319. fdate /ff /ofull    /A%BEGdate% /T%BEGtime% /Vfull1
  1320.  
  1321. rem get absolute minute of end date/time
  1322. fdate /ff /ominute# /A%ENDdate% /T%ENDtime% /VABStime2
  1323. fdate /ff /ofull    /A%ENDdate% /T%ENDtime% /Vfull2
  1324.  
  1325. rem calculate the difference between ABStime1 and ABStime2
  1326. fdate /f#dif  /A%ABStime1% /B%ABStime2% /VMinutes
  1327. :
  1328. rem calculate the number of hours in it took
  1329. fdate /f#Idiv  /A%minutes% /B60  /VHours
  1330.  
  1331. rem calculate the number of extra minutes it took
  1332. fdate /f#mod   /A%minutes% /B60  /VMins
  1333.  
  1334. echo      Begin date time: %BEGdate% %BEGtime%
  1335. echo        End date time: %ENDdate% %ENDtime%
  1336. echo.
  1337. echo      It took %hours% hours and %mins% minutes
  1338. echo      between %full1%
  1339. echo          and %full2%
  1340. echo.
  1341.  
  1342. fdate /f#Idiv /A%minutes% /B1440 /Vday1
  1343. fdate /f#mod  /A%minutes% /B1440 /Vmin1
  1344. fdate /f#Idiv /A%min1%    /B60   /Vhour1
  1345. fdate /f#mod  /A%min1%    /B60   /Vmin2
  1346. echo      or, expressed another way ...
  1347. echo      a total of: %day1% day(s) %hour1% hour(s) and %min2% minute(s).
  1348. echo.
  1349. echo.
  1350.  
  1351. REM cleanup
  1352. set ENDdate=
  1353. set BEGdate=
  1354. set BEGtime=
  1355. set ENDtime=
  1356. set full1=
  1357. set full2=
  1358. set minutes=
  1359. set ABStime1=
  1360. set ABStime2=
  1361. set day1=
  1362. set hour1=
  1363. set min1=
  1364. set min2=
  1365. set mins=
  1366. set hours=
  1367. :endit
  1368.  
  1369.  
  1370. :13 Time the execution of a piece of software
  1371. :==================================================================
  1372. COMMENT
  1373.   This example was developed coded before the addition of the #div and
  1374.   #idiv functions to Fdate, so the run time (in minutes) is not calculated
  1375.   by dividing the run time (in seconds) by 60, as it now could be.
  1376.  
  1377. @echo off
  1378. cls
  1379. ECHO The demo will run for 1 - 60 seconds.
  1380. echo.
  1381. ECHO ─────────────────────────────────────────────────────────────────────
  1382. ECHO CALCULATE HOW LONG IT TOOK TO RUN A PROGRAM (in seconds and minutes)
  1383. echo.
  1384. echo If you leave long batch files to run overnight, this technique can
  1385. echo be used to record how long each program in the batch file ran.
  1386. echo.
  1387. echo The technique for setting the values of environment variables in this
  1388. echo part of the demo uses temporary batch files and CALL statements.
  1389. echo If you have a program such as GET or STRINGS, you can use it instead.
  1390. ECHO ──────────────────────────────────────────────────────────────────────
  1391. echo.
  1392. PAUSE
  1393. cls
  1394.  
  1395. FDATE /Ff /At /Ohh:mm:ss /P"TESTPGM simulated execution begins at "
  1396.  
  1397. REM  GET PROGRAM BEGIN TIME, IN MINUTES
  1398. @set BegM=
  1399. @set EndM=
  1400. @set RunM=
  1401. FDATE /Ff /At /Ominute# /P"SET BegM=" >FDATJUNK.BAT
  1402. CALL FDATJUNK.BAT
  1403.  
  1404. REM  GET PROGRAM BEGIN TIME, IN SECONDS
  1405. set BegS=
  1406. set EndS=
  1407. set RunS=
  1408. FDATE /Ff /At /Osecond# /P"SET BegS=" >FDATJUNK.BAT
  1409. CALL FDATJUNK.BAT
  1410.  
  1411. rem ───────────────────────────────────────────────────────────────
  1412. rem [simulate execution of a program: loop for a minute or less]
  1413. rem [In a real batch file, you would put your program statements here]
  1414. rem ───────────────────────────────────────────────────────────────
  1415. :BegLoop
  1416.    FDATE /Ff /At /Osecond# /P"SET EndS=" >FDATJUNK.BAT
  1417.    CALL FDATJUNK.BAT
  1418.    FDATE /Ff /At /Ominute# /P"SET EndM=" >FDATJUNK.BAT
  1419.    CALL FDATJUNK.BAT
  1420.  
  1421.    rem  calculate run time (difference between start time and end time)
  1422.    FDATE /F#dif /A%EndM% /B%BegM% /P"SET RunM=" > FDATJUNK.BAT
  1423.    CALL FDATJUNK.BAT
  1424.  
  1425.    rem  calculate run time (difference between start time and end time)
  1426.    FDATE /F#dif /A%EndS% /B%BegS% /P"SET RunS=" > FDATJUNK.BAT
  1427.    CALL FDATJUNK.BAT
  1428.    echo      TESTPGM running, elapsed time: %RunS% seconds
  1429.  
  1430.    if (%RunM%)==()  goto EndLoop
  1431.    if (%RunM%)==(0) goto BegLoop
  1432. :EndLoop
  1433. rem ───────────────────────────────────────────────────────────────
  1434.  
  1435. REM  GET PROGRAM END TIME IN SECONDS
  1436. FDATE /Ff /At /Osecond# /P"SET EndS=" > FDATJUNK.BAT
  1437. CALL FDATJUNK.BAT
  1438.  
  1439. REM  GET PROGRAM END TIME IN MINUTES
  1440. FDATE /Ff /At /Ominute# /P"SET EndM=" > FDATJUNK.BAT
  1441. CALL FDATJUNK.BAT
  1442.  
  1443. FDATE /Ff /At /Ohh:mm:ss /P"TESTPGM simulated execution ends at "
  1444. echo.
  1445.  
  1446. echo TESTPGM: Program end   time (Absolute seconds): %EndS%
  1447. echo TESTPGM: Program begin time (Absolute seconds): %BegS%
  1448. rem  calculate run time (difference between start time and end time)
  1449. FDATE /F#dif /A%EndS% /B%BegS% /P"TESTPGM: Run time in seconds= "
  1450. set BegS=
  1451. set EndS=
  1452.  
  1453. echo.
  1454. echo TESTPGM: Program end   time (Absolute minutes): %EndM%
  1455. echo TESTPGM: Program begin time (Absolute minutes): %BegM%
  1456. rem  calculate run time (difference between start time and end time)
  1457. FDATE /F#dif /A%EndM% /B%BegM% /P"TESTPGM: Run time in minutes= "
  1458. DEL  FDATJUNK.BAT
  1459. set BegM=
  1460. set EndM=
  1461. set RunM=
  1462. set RunS=
  1463.  
  1464. :15 Find calendar date corresponding to a "business Julian" date
  1465. :==================================================================
  1466. rem business julian date is 1992:045.  Note input format CCYYjjj
  1467. FDATE /Ff /A1992045  /Iccyyjjj  /Od1
  1468.  
  1469. rem You don't need to left-zero-fill the day
  1470. FDATE /Ff /A199245  /Iccyyjjj  /Od1
  1471.  
  1472. rem You can assume the century, if you specify the YYjjj input format
  1473. FDATE /Ff /A9245  /Iyyjjj  /Od1
  1474.  
  1475.  
  1476. :16 Set your PC's date to a business julian date
  1477. :==================================================================
  1478. @echo off
  1479. goto enddoc
  1480. ---------------------------------------------------------------------
  1481. JDATE.BAT
  1482. This batch file was created by Aran Spence [CIS: 70162,3044].  Its function
  1483. is to emulate the DOS DATE command, but to allow the user to set the date
  1484. using a business julian date format (yyjjj) instead of mm-dd-yy.
  1485.  
  1486. Note the format is YYjjj. This is the BUSINESS julian date: a date
  1487. expressed as the number of days from the beginning of the year, when
  1488. January 1 is day 1.
  1489.  
  1490.            date      BUSINESS julian date
  1491.        -----------   --------------------
  1492.        Jan 5, 1992       92005
  1493.        Jan 5, 1993       93005
  1494.        Dec 31, 1993      93365  [Dec 31 is 365th day of year 1993]
  1495.  
  1496. As Aran originally wrote it, the user-prompt was virtually identical to
  1497. that of the DATE command.  I have modified his original version, so it
  1498. now looks less like the DATE command but displays a bit more
  1499. information, and so it can operate from the command line even if the
  1500. user does not have GET.
  1501.  
  1502. If the user enters a business julian date as a command-line
  1503. parameter, JDATE resets the date to that julian date.
  1504.              EXAMPLE:  JDATE 92005
  1505. If there is no input parameter, GET is used to prompt the user for a
  1506. date.  It is possible to use JDATE even if you don't have GET by
  1507. operating only from the command line, or by substituting some other
  1508. utility (such as STRINGS) for GET.
  1509.  
  1510. Note that the user must enter both of the year digits (yy),
  1511. but may enter an abbreviated set of day digits (jjj).  That is,
  1512. for julian day 92005, the user is permitted to enter 925.
  1513.  
  1514. One handy use for JDATE is simply to find out what the current
  1515. business julian date is.
  1516. ---------------------------------------------------------------------
  1517. :enddoc
  1518.  
  1519. SET NewJD=%1
  1520. if not (%NewJD%)==() goto GotDate
  1521.  
  1522. :ShowDate
  1523. Fdate /Ff /Od1    /P"Current Gregorian date: "
  1524. Fdate /Ff /Oyyjjj /P"'Business Julian' date: "
  1525.  
  1526. :GetDate
  1527. GET S "Enter new date (yyddd): " /VNewJD /L
  1528. if (%NewJD%)==() goto endit
  1529.  
  1530. :GotDate
  1531. Fdate /Ff /A%NewJD% /Omm-dd-yy /Iyyjjj /P"@DATE " > JUNKTEMP.BAT
  1532. if errorlevel 1 if exist JUNKTEMP.BAT del JUNKTEMP.BAT
  1533. if errorlevel 1 echo Invalid date "%NewJD%"
  1534. if errorlevel 1 goto GetDate
  1535.  
  1536. rem  reset the date by calling JUNKTEMP.BAT
  1537. call JUNKTEMP.BAT
  1538. del  JUNKTEMP.BAT
  1539.  
  1540. echo SYSTEM DATE HAS BEEN RESET
  1541. Fdate /Ff /Od1    /P"Current Gregorian date: "
  1542. Fdate /Ff /Oyyjjj /P"'Business Julian' date: "
  1543.  
  1544. :endit
  1545. SET NewJD=
  1546. echo.
  1547.  
  1548.  
  1549. :18 Determine if parm %1 contains a valid date
  1550. :==================================================================
  1551. COMMENT
  1552.   Note that we throw away the FDATE output by redirecting it to NUL.  All
  1553.   we really want here is the errorlevel, which tells us whether or not the
  1554.   string in %1 is a valid year.
  1555.  
  1556. Fdate /Fv /Imm-dd-ccyy /A%1  >nul
  1557. if errorlevel 1 echo Parm 1 was not a valid date: %1
  1558. if errorlevel 1 goto endit
  1559.  
  1560. :
  1561. : Put the body of your batch file here.
  1562. :
  1563.  
  1564. :endit
  1565.  
  1566. :19 "Roll your own" date format 
  1567. :==================================================================
  1568. echo Display date in custom-made format: yymn3dd
  1569. Fdate /Ff /Oyy              /V
  1570. Fdate /Ff /Omn3 /P"%fdate%" /V
  1571. Fdate /Ff /Odd  /P"%fdate%" /V
  1572.  
  1573. echo Today is %fdate%
  1574. set fdate=
  1575.  
  1576.  
  1577.  
  1578. :20 Find the 4th Thursday in November (Thanksgiving)
  1579. :==================================================================
  1580. Fdate /Fw /D5 /N4 /A11-01-%year% /Imm-dd-ccyy /Od1 /P"Thanksgiving: "
  1581.  
  1582.  
  1583.  
  1584. :22 On a date, show what anniversary it is for some event
  1585. :==================================================================
  1586. See HOLIDAYS.BAT demo batch file
  1587.  
  1588.  
  1589.  
  1590. :23 Show a list of holidays in a given year
  1591. :==================================================================
  1592. See HOLIDAYS.BAT demo batch file
  1593.  
  1594.  
  1595. :24 Show a list of Federal holidays in a given year
  1596. :==================================================================
  1597. See HOLIFEDS.BAT demo batch file
  1598.  
  1599.  
  1600. :25 Determine if a year is valid, and evenly divisible by 4
  1601. :==================================================================
  1602.  
  1603. @echo off
  1604. cls
  1605. echo FUNCTION: Accept a year parm (CCYY) as parameter 1.  Determine if
  1606. echo the year is an election or inauguration year in the United States.
  1607. echo ===================================================================
  1608.  
  1609. rem verify %1 is a valid year
  1610. Fdate /Fv /Imm-dd-ccyy /A01-01-%1 >nul
  1611. if errorlevel 1 echo Year parm [%1] is not valid.
  1612. if errorlevel 1 goto endit
  1613.  
  1614. Fdate /Ff /Imm-dd-ccyy /A01-01-%1 /p"@set year=">junktemp.bat
  1615. call junktemp.bat
  1616.  
  1617. Fdate /F#mod /A%1 /B4 /p"@set mod=">junktemp.bat
  1618. call junktemp.bat
  1619. if (%mod%)==(0) echo %1 is an American presidential election year.
  1620. if (%mod%)==(1) echo %1 is an American presidential inauguration year.
  1621. for %%v in (2 3) do if (%mod%)==(%%v) echo %1 is not an election year.
  1622. for %%v in (2 3) do if (%mod%)==(%%v) echo %1 is not an inauguration year.
  1623.  
  1624. set mod=
  1625. :endit
  1626. if exist junktemp.bat del  junktemp.bat
  1627.  
  1628.  
  1629.  
  1630.  
  1631. :30 Compare a file's date to today's date
  1632. :==================================================================
  1633. rem Compare today's date to the date on the filename in %1
  1634. Fdate /Fcomp /At /If /B%1 /Vcomp
  1635. if (%comp%)==(EQ) echo %1 was created or updated today
  1636. set comp=
  1637.  
  1638. :32 Display a list of all files that were created/updated today. 
  1639. :==================================================================
  1640. @echo off
  1641. if (%1)==(SUBROUTINE) goto %2
  1642.  
  1643. CLS
  1644. ECHO FILES MEETING FILESPEC [%1] THAT WERE CREATED OR UPDATED TODAY
  1645. REM  The batch file calls itself: Its own name is in parm %0
  1646. for %%v in (%1) do  CALL %0 SUBROUTINE CHECKFILE %%v
  1647.  
  1648. set comp=
  1649. goto endit
  1650.  
  1651. :CHECKFILE
  1652. shift
  1653. shift
  1654.  
  1655. rem Compare today's date to the date on the %1 file
  1656. Fdate /Fcomp /If /A%1 /Vcomp  
  1657.  
  1658. rem echo the filename if the file was created/updated today
  1659. if (%comp%)==(EQ) echo %1
  1660. :endit
  1661.  
  1662. :33 Delete files more than X days old (use a batch-file subroutine)
  1663. :==================================================================
  1664. See the COMMENTARY that follows the text of the batch file.
  1665.  
  1666.  
  1667. @echo off
  1668. if (%1)==(SUBROUTINE) goto %2
  1669. cls
  1670.  
  1671. goto EndDoc
  1672. ----------------------------------------------------------------------
  1673. OLDFILES.BAT
  1674. This batch file shows how to do work on files that are older than
  1675. %NumDays%.  The PROCESS! subroutine can be modified to do any kind of
  1676. work you want.
  1677. ----------------------------------------------------------------------
  1678. :EndDoc
  1679.  
  1680. :: set the number of days in the past.   if this value is not passed
  1681. :: in via parameter %1, it defaults to 3 days
  1682. set NumDays=%1
  1683. if (%NumDays%)==() SET NumDays=3
  1684.  
  1685.  
  1686. echo ------------------------------------------------------------------
  1687. echo           PROCESSING FILES CREATED MORE THAN %NumDays% DAYS AGO
  1688. echo ------------------------------------------------------------------
  1689. for %%v in (*.*) do  CALL %0 SUBROUTINE PROCESS! %%v
  1690. echo ------------------------------------------------------------------
  1691. echo           END OF PROCESSING
  1692. echo ------------------------------------------------------------------
  1693.  
  1694. :: CLEANUP
  1695. set NumDays=
  1696. set DaysOld=
  1697. set Comparison=
  1698. GOTO ENDIT
  1699.  
  1700. :
  1701. :PROCESS!
  1702. shift
  1703. shift
  1704.  
  1705. :: get difference in days between filedate and today.
  1706. :: Note that /B parm (which is omitted) defaults to today's date.
  1707. fdate /fdif   /A%1        /IF          /VDaysOld
  1708.  
  1709. :: compare DaysOld to NumDays
  1710. fdate /f#comp /A%DaysOld% /B%NumDays%  /Vcomparison
  1711.  
  1712. :: the following line will DISPLAY THE NAME AND AGE OF
  1713. :: any file for which %DaysOld% is greater than %NumDays%
  1714. :: --------------------------------------------------------------
  1715. if (%comparison%)==(GT) echo %1 is %DaysOld% days old.
  1716.  
  1717. :: EXAMPLE (to activate this routine, remove the REM from column 1)
  1718. :: the following line will COPY TO AN ARCHIVE SUBDIRECTORY
  1719. :: any file for which %DaysOld% is greater than %NumDays%
  1720. :: -----------------------------------------------
  1721. REM if (%comparison%)==(GT) COPY %1 C:\ARCHIVE\*.*
  1722.  
  1723. :: EXAMPLE (to activate this routine, remove the REM from column 1)
  1724. :: the following line will DELETE
  1725. :: any file for which %DaysOld% is greater than %NumDays%
  1726. :: -----------------------------------------------
  1727. REM if (%comparison%)==(GT) DEL %1
  1728.  
  1729. :: fall through to endit
  1730.  
  1731. :endit
  1732.  
  1733.  ===============================================================
  1734.                         COMMENTARY BEGIN
  1735.  ===============================================================
  1736.  This batch file uses a crude, but effective, technique for giving a
  1737.  batch file the ability to call subroutines.  If you've never seen
  1738.  something like this before, it is sort of mind-blowing.  Here's some
  1739.  commentary on the more important lines involved in the technique.
  1740.  ===============================================================
  1741.  
  1742.  if (%1)==(SUBROUTINE) goto %2
  1743.  
  1744.     COMMENTARY:
  1745.     If the first parameter, %1, is "SUBROUTINE", then the batch file
  1746.     recognizes that it is being called for the purpose of executing
  1747.     one of its own subroutines.  In such a case, it does a GOTO to the
  1748.     start of the requested subroutine.  That is, it goes to the label
  1749.     whose name is in the second parameter.
  1750.  
  1751.     Explicitly specifying the name of the desired subroutine permits
  1752.     permits us to have multiple subroutines in the batch file,
  1753.     each with its own name.  (As it happens, in this batch file
  1754.     we have only one subroutine, named "PROCESS!")
  1755.  
  1756.     If the first parameter is not "SUBROUTINE", then we fall through
  1757.     and begin executing the main routine of the batch file.  In such a
  1758.     case, the first parameter (%1) may contain a number, indicating
  1759.     the number of days to use in determining which files to delete.
  1760.  
  1761.     Note that this technique will make the batch file malfunction
  1762.     if the user himself ever executes the batch file from the
  1763.     DOS command line with the word "SUBROUTINE" as the first
  1764.     parameter, the word "PROCESS!" as the second parameter, and a
  1765.     third parameter that is missing or not a valid filename.
  1766.     This is so unlikely, however, that it is reasonable
  1767.     to assume that it will never happen.
  1768.  
  1769.  ===============================================================
  1770.  
  1771.  for %%v in (*.*) do  CALL %0 SUBROUTINE PROCESS! %%v
  1772.  
  1773.     COMMENTARY:
  1774.     In a batch file, %0 contains the name by which the batch file was
  1775.     invoked.  We use this fact to allow a batch file to call itself,
  1776.     regardless of what name the user has given to it.
  1777.  
  1778.     The first parameter passed, when the batch file calls
  1779.     itself, is the string "SUBROUTINE".  This string allows the batch
  1780.     file to recognize when it is being called for the purpose of
  1781.     executing one of its own subroutines.
  1782.  
  1783.     The second parameter is the name of the subroutine that we want
  1784.     to call: in this case, "PROCESS!".
  1785.  
  1786.     The third parameter is what we would normally think of as the first
  1787.     parameter to the subroutine.  In this case, when the
  1788.     FOR statement is executed, and the substitution for %%v takes
  1789.     place, it will contain the name of the file to be processed.
  1790.     Note that we could, if we wished, pass additional parameters to
  1791.     the subroutine.  Note also that we can control the files that
  1792.     we process.  We do so via the filemask in the FOR statement.
  1793.     It we used, for example, "*.EXE", then we would process only
  1794.     executable files.
  1795.  
  1796.  ===============================================================
  1797.  
  1798.  GOTO ENDIT
  1799.  
  1800.    COMMENTARY:
  1801.    When the mainline of the batch file is finished executing, we
  1802.    goto the end of the batch file.  We MUST do this GOTO in order
  1803.    to avoid falling through into, and starting to execute, the first
  1804.    of the batch file's subroutines.
  1805.  
  1806.  ===============================================================
  1807.  
  1808.  :PROCESS!
  1809.  shift
  1810.  shift
  1811.  
  1812.    COMMENTARY:
  1813.    Note that when the batch file is called as a subroutine, and the
  1814.    batch file goes to the PROCESS! label, the values of the parms are:
  1815.            %0 = [the name of the batch file]
  1816.            %1 = SUBROUTINE
  1817.            %2 = PROCESS!
  1818.            %3 = [name of the file to be processed]
  1819.  
  1820.     We shift all the parmeters to the left twice, to move the
  1821.     parameter(s) into what we think of as the
  1822.     proper places for parameters to the subroutine.
  1823.  
  1824.     After the first SHIFT command:
  1825.            %0 = SUBROUTINE
  1826.            %1 = PROCESS!
  1827.            %2 = [name of the file to be processed]
  1828.  
  1829.     After the second SHIFT command:
  1830.            %0 = PROCESS!
  1831.            %1 = [name of the file to be processed]
  1832.  
  1833.     Now %1 contains what we think of as the proper parameter(s)
  1834.     to the subroutine.  In this case, %1 contains the filename that
  1835.     we want the subroutine to process.
  1836.  
  1837.     At the end of every subroutine, there should be a GOTO ENDIT,
  1838.     which causes the batch file to go to its own end, and then
  1839.     end and return control to the statement in the program which called
  1840.     it.  (This is, of course, the CALL statement embedded in the
  1841.     FOR statement.)
  1842.  
  1843.     We can optimize the batch file a little by omitting the "goto endit"
  1844.     at the end of the last subroutine.  Instead, we simply allow the
  1845.     last subroutine to fall through to the end of the batch file.
  1846.  
  1847.  ===============================================================
  1848.                          COMMENTARY END
  1849.  ===============================================================
  1850.  
  1851. :34 Loop through an array of environment variables
  1852. :======================================================================
  1853. @echo off
  1854. cls
  1855. SET pct=%%%
  1856. SET prefix=Address
  1857.  
  1858. ECHO LOADING AN ARRAY
  1859. SET subscript=1
  1860. SET %prefix%.%subscript%=Stephen Ferg
  1861. SET subscript=2
  1862. SET %prefix%.%subscript%=5113 N. 8th Road
  1863. SET subscript=3
  1864. SET %prefix%.%subscript%=Arlington, VA 22205
  1865.  
  1866. ECHO UNLOADING AND DISPLAYING THE ARRAY
  1867. SET subscript=1
  1868. :LoopTop
  1869. REM do while subscript less than/equal 3
  1870. if %subscript%==4 goto LoopEnd
  1871.  
  1872.    REM put value of subscripted variable into tempvar
  1873.    ECHO SET tempvar=%pct%%prefix%.%subscript%%pct%>JUNKTEMP.BAT
  1874.    CALL JUNKTEMP.BAT
  1875.  
  1876.    REM display value of subscripted variable
  1877.    ECHO %prefix%.%subscript% is: %tempvar%
  1878.  
  1879.    REM delete subscripted variable
  1880.    SET %prefix%.%subscript%=
  1881.  
  1882.    REM increment the loop variable
  1883.    Fdate /F#add /A%subscript% /B1 /Vsubscript
  1884.    goto LoopTop
  1885. :LoopEnd
  1886.  
  1887. SET pct=
  1888. SET tempvar=
  1889. SET prefix=
  1890. SET subscript=
  1891. DEL JUNKTEMP.BAT
  1892.  
  1893. :44 Do something on the last day (or last Friday) of the month
  1894. :==================================================================
  1895. COMMENT
  1896. We often need batch files that do some special task on the last day of the
  1897. month: run a backup job, display a reminder message, etc.  This example
  1898. batch file, LASTDAY.BAT, simply displays a message -- you can modify it to
  1899. do whatever it is that YOU want to do.
  1900.  
  1901. If you plan to run LASTDAY.BAT at work, and you work Monday through Friday,
  1902. then checking for the last day of the month would be a poor strategy --
  1903. after you leave work on a Friday, the last day of the month might occur on
  1904. the following Saturday or Sunday.   So I've included a check to see if the
  1905. Friday is the last working day of the month.  If you don't want that
  1906. functionality, deleting the lines between the first and last occurrence of
  1907. the string "EndCheck" will remove it.
  1908. =======================================================================
  1909.  @echo off
  1910.  REM ---------------------------------------------------------------
  1911.  REM check to see if today is the last day of the month
  1912.  REM ---------------------------------------------------------------
  1913.  REM get today's month
  1914.  fdate /ff        /omm /vmmtoday
  1915.  
  1916.  REM get tomorrow's month
  1917.  fdate /fadd /n1 /omm  /vmmtomorrow
  1918.  
  1919.  REM if tomorrow occurs in a different month,
  1920.  REM then today is the last day of this month
  1921.  if not (%mmtoday%)==(%mmtomorrow%) echo LAST DAY OF THE MONTH
  1922.  if not (%mmtoday%)==(%mmtomorrow%) goto EndCheck
  1923.  
  1924.  REM -------------------------------------------------------------
  1925.  REM check to see if today is the last Friday of the month
  1926.  REM -------------------------------------------------------------
  1927.  rem get today's day of the week, to see if it is Friday
  1928.  fdate /ff /odow3 /vdow3
  1929.  if not (%dow3%)==(Fri) goto EndCheck
  1930.  
  1931.  REM today is Friday.  Get next Monday's month
  1932.  fdate /fadd /n3 /omm  /vmmMonday
  1933.  
  1934.  REM if next Monday occurs in a different month,
  1935.  REM then today is the last Friday of this month
  1936.  if not (%mmtoday%)==(%mmMonday%) echo LAST WORKING DAY OF THE MONTH
  1937.  
  1938.  :EndCheck
  1939.  
  1940.  REM cleanup
  1941.  set dow3=
  1942.  set mmtoday=
  1943.  set mmtomorrow=
  1944.  set mmMonday=
  1945.  
  1946. :45 Get information about the month prior to the current month
  1947. :==================================================================
  1948. COMMENT
  1949. When running a monthly backup job at the beginning of the month, one often
  1950. needs to identify the previous month, or the last day of the previous
  1951. month.  Here's how to use Fdate to obtain that sort of information. 
  1952. Basically, we subtract one day from the first day of the current month,
  1953. giving us the last day of the previous month.
  1954. =======================================================================
  1955. @echo off
  1956. cls
  1957. : The simplest way to get information about last month is to subtract
  1958. : 1 day from the first day of this month ...
  1959.  
  1960. fdate /fsub /n1 /att-01-tttt /omm   /p"Last month was.................: "
  1961. fdate /fsub /n1 /att-01-tttt /occyy /p"Last month occurred in the year: "
  1962. fdate /fsub /n1 /att-01-tttt /odd   /p"The last day of last month was : "
  1963. fdate /fsub /n1 /att-01-tttt /od1   /p"The last day of last month was : "
  1964.  
  1965. :51 Represent a date in a short (4-byte) format (technique #1)
  1966. :==================================================================
  1967. COMMENT
  1968. A common use of Fdate is to format today's date and use it to rename a file
  1969. (typically a log file of some sort).  You may wish to store the date
  1970. information in as few characters as possible, in order to maximize the
  1971. number of other characters in the filename that you can use to store other
  1972. information.
  1973.  
  1974. In this example, and the next one, I illustrate two ways to store a date in
  1975. 4 bytes.
  1976.  
  1977.  
  1978. The simplest way is to represent today's date as a 4-digit number.
  1979. To do this, we first pick a base date:  I'll use January 1, 1990.
  1980. Then it is a simple matter to calculate the number of days between today
  1981. and the base date:
  1982.  
  1983.            FDATE /Fdif /at /b01-01-1990 
  1984.  
  1985. Starting in 1993, this will always generate a 4-digit number, and will
  1986. continue to do so for 20 years, until approximately the year 2003.  Dates
  1987. before 1993 may produce 1-, 2-, or 3-digit numbers, and dates after 2003
  1988. will begin to produce 5-digit numbers.  But this technique will work quite
  1989. nicely for most ordinary purposes for the next 20 years.  
  1990.  
  1991. If you're still using DOS in the year 2003, then in 2003 you can switch to
  1992. using January 1, 2000 as your base date and function quite nicely for the
  1993. next 20 years after that.
  1994.  
  1995.  
  1996. :52 Represent a date in a short (4-byte) format (technique #2)
  1997. :==================================================================
  1998.  
  1999. @echo off
  2000. cls
  2001.  
  2002. goto end-doc
  2003. ------------------------------------------------------------------
  2004. This batch file shows two ways to use Fdate and SetXX.BAT to
  2005. obtain and represent today's date in 4 characters, YYMD, where:
  2006.  
  2007.   YY is the year (e.g. "93" for 1993)
  2008.    M is the month in extended hexadecimal (XX) notation
  2009.    D is the day-of-the-month in extended hexadecimal (XX) notation
  2010.  
  2011. The text of SetXX.BAT, and an explanation of extended hex notation,
  2012. can be found in the next example.
  2013. ------------------------------------------------------------------
  2014. :end-doc
  2015.  
  2016. rem ----------------------------------------------------------------
  2017. rem          VERSION 1 (using JUNK.BAT temporary batch file)
  2018. rem ----------------------------------------------------------------
  2019.  
  2020. REM OBTAIN 1-CHARACTER REPRESENTATION FOR THE MONTH
  2021. fdate /ff /omm /p"@call SetXX xm ">junk.bat
  2022. call junk.bat
  2023. echo XX representation of this month's number      is %xm%
  2024.  
  2025. REM OBTAIN 1-CHARACTER REPRESENTATION FOR THE DAY
  2026. fdate /ff /odd /p"@call SetXX xd ">junk.bat
  2027. call junk.bat
  2028. echo XX representation of today's day of the month is %xd%
  2029.  
  2030. REM CONCATENATE THEM TO THE 2-CHARACTER REPRESENTATION FOR THE YEAR
  2031. fdate /ff /oyy /p"@set xx=" /s"%xm%%xd% >junk.bat
  2032. call junk.bat
  2033. echo XX representation of today's full date        is %xx%
  2034.  
  2035. REM CLEANUP
  2036. set xm=
  2037. set xd=
  2038. set xx=
  2039. del junk.bat
  2040.  
  2041. echo.
  2042. :
  2043. echo.
  2044. rem ----------------------------------------------------------------
  2045. rem          VERSION 2 (using JUNK environment variable)
  2046. rem ----------------------------------------------------------------
  2047.  
  2048. REM OBTAIN 1-CHARACTER REPRESENTATION FOR THE MONTH
  2049. fdate /ff /omm /p"call SetXX xm " /vjunk
  2050. %junk%
  2051. echo XX representation of this month's number      is %xm%
  2052.  
  2053. REM OBTAIN 1-CHARACTER REPRESENTATION FOR THE DAY
  2054. fdate /ff /odd /p"call SetXX xd " /vjunk
  2055. %junk%
  2056. echo XX representation of today's day of the month is %xd%
  2057.  
  2058. REM CONCATENATE THEM TO THE 2-CHARACTER REPRESENTATION FOR THE YEAR
  2059. fdate /ff /oyy /p"set xx=" /s"%xm%%xd%" /vjunk
  2060. %junk%
  2061. echo XX representation of today's full date        is %xx%
  2062.  
  2063. REM CLEANUP
  2064. set xm=
  2065. set xd=
  2066. set xx=
  2067. set junk=
  2068.  
  2069. echo.
  2070. echo.
  2071.  
  2072.  
  2073. :53 SetXX.BAT (used in the previous example)
  2074. :==================================================================
  2075. @echo off
  2076.  
  2077. goto end-doc
  2078. --------------------------------------------------------------------
  2079. "Extended hexadecimal" (XX) notation uses all of the digits, and
  2080. all of the letters of the alphabet, to express numbers in the range
  2081. of 0 to 35 as a single character.  This batch file converts a 2-digit
  2082. number in the range of 00 to 35 to xx notation.
  2083.  
  2084. This batch file expects 2 parameters:
  2085.  %1 contains the name of the environment variable that you
  2086.     want to use to hold the xx value
  2087.  %2 contains the 2-digit number that you want to convert to xx
  2088. --------------------------------------------------------------------
  2089. :end-doc
  2090.  
  2091. if (%2)==() goto endit
  2092. set %1=
  2093. if (%2)==(00) set %1=0
  2094. if (%2)==(01) set %1=1
  2095. if (%2)==(02) set %1=2
  2096. if (%2)==(03) set %1=3
  2097. if (%2)==(04) set %1=4
  2098. if (%2)==(05) set %1=5
  2099. if (%2)==(06) set %1=6
  2100. if (%2)==(07) set %1=7
  2101. if (%2)==(08) set %1=8
  2102. if (%2)==(09) set %1=9
  2103.  
  2104. if (%2)==(10) set %1=A
  2105. if (%2)==(11) set %1=B
  2106. if (%2)==(12) set %1=C
  2107. if (%2)==(13) set %1=D
  2108. if (%2)==(14) set %1=E
  2109. if (%2)==(15) set %1=F
  2110. if (%2)==(16) set %1=G
  2111. if (%2)==(17) set %1=H
  2112. if (%2)==(18) set %1=I
  2113. if (%2)==(19) set %1=J
  2114.  
  2115. if (%2)==(20) set %1=K
  2116. if (%2)==(21) set %1=L
  2117. if (%2)==(22) set %1=M
  2118. if (%2)==(23) set %1=N
  2119. if (%2)==(24) set %1=O
  2120. if (%2)==(25) set %1=P
  2121. if (%2)==(26) set %1=Q
  2122. if (%2)==(27) set %1=R
  2123. if (%2)==(28) set %1=S
  2124. if (%2)==(29) set %1=T
  2125. :
  2126. if (%2)==(30) set %1=U
  2127. if (%2)==(31) set %1=V
  2128. if (%2)==(32) set %1=W
  2129. if (%2)==(33) set %1=X
  2130. if (%2)==(34) set %1=Y
  2131. if (%2)==(35) set %1=Z
  2132.  
  2133. :endit
  2134.  
  2135.  
  2136. :54 Customize Fdate for a language of your choice
  2137. :==================================================================
  2138. @echo off
  2139. cls
  2140. goto end-doc
  2141. ------------------------------------------------------------------
  2142. You can use Fdate with a customized batch file to obtain the names of
  2143. the days of the week and the months in a language of your choice.  Or
  2144. you could use it to obtain names in uppercase, or the first 5
  2145. characters of the names (rather than the first three), or some other
  2146. customized formatting of your choice.)
  2147.  
  2148. I've invented a language called Fergian, which has its own names for
  2149. the days of the week, and the months.  In the following examples, I
  2150. invoke FERGIAN.BAT to make the translation.  The text of FERGIAN.BAT,
  2151. which does the real work here, is given in the next example.
  2152. ------------------------------------------------------------------
  2153. :end-doc
  2154.  
  2155. fdate /ff /omm /v
  2156. call Fergian mm- result %Fdate%
  2157. echo Month  is          %result%
  2158.  
  2159. fdate /ff  /omm /v
  2160. call Fergian mm3 result %Fdate%
  2161. echo Month3 is          %result%
  2162.  
  2163. fdate /ff /odow#  /v
  2164. call Fergian dw- result %Fdate%
  2165. echo Day of week  is    %result%
  2166.  
  2167. fdate /ff /odow#  /v
  2168. call Fergian dw3 result %Fdate%
  2169. echo Day of week3 is    %result%
  2170.  
  2171. REM cleanup
  2172. set Fdate=
  2173. set result=
  2174.  
  2175. :55 Fergian.BAT (used in the previous example)
  2176. :==================================================================
  2177. @echo off
  2178. set  %2=
  2179. goto %1
  2180.  
  2181. goto end-doc
  2182. --------------------------------------------------------------------
  2183. This batch file converts a month number, or day of the week number,
  2184. to a name in the FERGIAN language.
  2185. You can copy this batch file and customize it, to make it translate
  2186. into some other language of your choice.
  2187.  
  2188. This batch file expects the following parameters:
  2189.  
  2190. %1 contains the type of number you want to convert:
  2191.    MM- if you want the entire name of the month
  2192.    MM3 if you want the first 3 letters of the name of the month
  2193.  
  2194.    DW- if you want the entire name of the day of the week
  2195.    DW3 if you want the first 3 letters of the name of the day of the week
  2196.  
  2197. %2 contains the name of the environment variable that you
  2198.    want to use to hold the result
  2199.  
  2200. %3 contains the number that you want to convert
  2201. --------------------------------------------------------------------
  2202. :end-doc
  2203.  
  2204. :MM-
  2205. if (%3)==(01) set %2=Jaded
  2206. if (%3)==(02) set %2=Febrile
  2207. if (%3)==(03) set %2=Martial
  2208. if (%3)==(04) set %2=Abigail
  2209. if (%3)==(05) set %2=Maybelene
  2210. if (%3)==(06) set %2=Junkaroo
  2211. if (%3)==(07) set %2=Julia
  2212. if (%3)==(08) set %2=Augmentation
  2213. if (%3)==(09) set %2=Separation
  2214. if (%3)==(10) set %2=Ostentation
  2215. if (%3)==(11) set %2=Novelty
  2216. if (%3)==(12) set %2=Decadence
  2217. goto endit
  2218.  
  2219. :
  2220. :MM3
  2221. if (%3)==(01) set %2=Jad
  2222. if (%3)==(02) set %2=Feb
  2223. if (%3)==(03) set %2=Mar
  2224. if (%3)==(04) set %2=Abi
  2225. if (%3)==(05) set %2=May
  2226. if (%3)==(06) set %2=Jun
  2227. if (%3)==(07) set %2=Jul
  2228. if (%3)==(08) set %2=Aug
  2229. if (%3)==(09) set %2=Sep
  2230. if (%3)==(10) set %2=Ost
  2231. if (%3)==(11) set %2=Nov
  2232. if (%3)==(12) set %2=Dec
  2233. goto endit
  2234.  
  2235. :DW-
  2236. if (%3)==(1) set %2=SunDay
  2237. if (%3)==(2) set %2=MoonDay
  2238. if (%3)==(3) set %2=TwickasDay
  2239. if (%3)==(4) set %2=WodensDay
  2240. if (%3)==(5) set %2=ThorsDay
  2241. if (%3)==(6) set %2=FreyasDay
  2242. if (%3)==(7) set %2=SaturnDay
  2243. goto endit
  2244.  
  2245.  
  2246. :DW3
  2247. if (%3)==(1) set %2=Sun
  2248. if (%3)==(2) set %2=Moo
  2249. if (%3)==(3) set %2=Twi
  2250. if (%3)==(4) set %2=Wod
  2251. if (%3)==(5) set %2=Tho
  2252. if (%3)==(6) set %2=Fre
  2253. if (%3)==(7) set %2=Sat
  2254. goto endit
  2255.  
  2256.  
  2257. :endit
  2258.  
  2259. :61 DO-ONCE: Run apps when booting for the first time of the day
  2260. :===============================================================
  2261. COMMENT
  2262.   Put this code in AUTOEXEC.BAT.  Note that this batch code requires DOS
  2263.   3.3+, since it uses CALL.
  2264.  
  2265. if not exist C:\LASTRUN.BAT goto RunNow
  2266.  
  2267. rem call LASTRUN.BAT, which will set an environment variable, %LASTRUN%,
  2268. rem that will contain the date when this batch file was last run.
  2269. rem ------------------------------------------------------------------
  2270. call C:\LASTRUN.BAT
  2271.  
  2272. rem compare the date in %LASTRUN% to today's date
  2273. rem ------------------------------------------------------------------
  2274. Fdate /Fcomp /At /B%LastRun% /Vcomp
  2275.  
  2276. : Today's date may be less than %LASTRUN% if you reset the system clock
  2277. IF (%COMP%)==(LT) goto NoRun
  2278. : If %LASTRUN% was the same as today's date,
  2279. :   then this batch file has already been run once today
  2280. IF (%COMP%)==(EQ) goto NoRun
  2281.  
  2282. : Daily processing hasn't been run today. Run it.
  2283. : Here, you should put the batch-file body --
  2284. : the code to run the applications that you want to run once per day
  2285. :
  2286.  
  2287. : ------------------------------------------------------------------
  2288. : Save today's date in a new version of LastRun.BAT.  Note that
  2289. : this code will be executed only if daily processing runs to
  2290. : completion without hanging the machine or aborting the batch file.
  2291. : ------------------------------------------------------------------
  2292. Fdate /Ff /Omm-dd-ccyy /At /P"@set LastRun=">LastRun.BAT
  2293.  
  2294. :NoRun
  2295. set LastRun=
  2296. set COMP=
  2297.  
  2298. :62a Run specific software, depending on the day of the week
  2299. :==================================================================
  2300. COMMENT
  2301. This is a very common use for Fdate.  I use it to load alarm-clock software
  2302. that will beep at me -- at different times for different days of the week -
  2303. - to remind me that it is time to attend a regular weekly meeting that is
  2304. scheduled for that day of the week.
  2305.  
  2306. Note that stuff for a given day of  the week will be executed every time
  2307. you boot up on that day of the week.  That is what you want if, like me,
  2308. you are loading alarm-clock software.
  2309.  
  2310. If your application is different, and you want stuff for a given day of the
  2311. week to be run only once -- the first time you boot up each day --then
  2312. first copy the code from DO-ONCE (the previous example) into your
  2313. AUTOEXEC.BAT file, then put this code into AUTOEXEC.BAT in the body of the
  2314. DO-ONCE code.  If you do that, then this code will be run only once per
  2315. day, even if you boot up multiple times per day.
  2316.  
  2317. Remember that if you are executing other batch files from a batch file, 
  2318. you probably want to invoke them with a CALL statement:
  2319.               CALL batchfilename parm1 parm2 ...
  2320. so control will return to the calling batch file when execution of the
  2321. called batch file is complete.      
  2322. ========================================================================
  2323.  
  2324. rem get 3-character day-of-week name and put it in DOW e-var
  2325. FDATE /ff /oDOW3 /vDOW
  2326. goto %DOW%
  2327.  
  2328. :MON
  2329. :
  2330. : Here, put code to run stuff for this day of the week.
  2331. :    for example: CALL MONDAY.BAT 
  2332. :
  2333. goto END-DOW
  2334.  
  2335.  
  2336. :FRI
  2337. :
  2338. : Here, put code to run stuff for this day of the week.
  2339. :
  2340. goto END-DOW
  2341.  
  2342. rem do nothing on the following days -- fall through to END-DOW
  2343. :SAT
  2344. :SUN
  2345. :TUE
  2346. :WED
  2347. :THU
  2348. :END-DOW
  2349. set dow=
  2350.  
  2351. :62b Run specific software, depending on the day of the week
  2352. :==================================================================
  2353. COMMENT
  2354.   This is a variation on the last example.  Note that the string
  2355.   comparison is case sensitive.
  2356.  
  2357. rem get 3-character day-of-week name and put it in DOW e-var
  2358. FDATE /ff /oDOW3 /vDOW
  2359.  
  2360. if (%DOW%)==(Mon) echo Running regular Monday backup.  Please wait...
  2361. if (%DOW%)==(Mon) CALL BACKUP C: 
  2362. if (%DOW%)==(Mon) CALL BACKUP D:   
  2363. if (%DOW%)==(Mon) CALL BACKUP E:   
  2364. if (%DOW%)==(Mon) CALL BACKUP F:   
  2365.  
  2366. if (%DOW%)==(Thu) echo Running regular Thursday backup.  Please wait...
  2367. if (%DOW%)==(Thu) CALL BACKUP C: 
  2368. if (%DOW%)==(Thu) CALL BACKUP F: 
  2369. set dow=
  2370.  
  2371.  
  2372.  
  2373. :63 Run a program at a specified time later in the day
  2374. :==================================================================
  2375. COMMENT
  2376.   This batch file involves a lot of disk activity because DOS re-reads the
  2377.   batch file from disk every time it does a GOTO LOOPTOP.  You can avoid
  2378.   all this disk activity by running the batch file from a RAM DISK.
  2379.  
  2380. REM GET CURRENT ABSOLUTE MINUTE AND PUT IN ENVIRONMENT VARIABLE RUNTIME
  2381. FDATE /Ff /At /Ominute#  |STRINGS RunTime= ASK >NUL
  2382.  
  2383. REM ADD 120 MINUTES (2 HOURS) TO ENVIRONMENT VARIABLE RUNTIME
  2384. FDATE /F#add /A%RunTime% /B120 |STRINGS RunTime= ASK >NUL
  2385.  
  2386. REM LOOP UNTIL NOWTIME HAS REACHED RUNTIME
  2387. :LoopTop
  2388.   FDATE /Ff /At  /Ominute#   |STRINGS NowTime=  ASK >NUL
  2389.   FDATE /F#comp  /A%NowTime% /B%RunTime% |STRINGS TimeComp= ASK >NUL
  2390.   if (%TimeComp%)==(LT) goto loopTop
  2391. :LoopEnd
  2392.  
  2393. echo STARTING EXECUTION OF APPLICATION: [program name]
  2394.  
  2395.  
  2396.  
  2397. :67 Change a file's name to a name that contains today's date
  2398. :==================================================================
  2399. FDATE /Ff /Atoday /Oyymmdd /vdate1
  2400. ren  BACKUP.LOG  BK%DATE1%.LOG
  2401. SET  DATE1=
  2402.  
  2403.  
  2404.  
  2405. :68 Change a file's name to a name containing an absolute minute 
  2406. :===============================================================
  2407. COMMENT
  2408.   This is a way to keep a complete series of files, such as log files,
  2409.   that are all created with the same name on the same day.  The only
  2410.   requirement is that they be created at least one minute apart.  You
  2411.   won't need to be able to decipher the absolute minute to figure out when
  2412.   the file was created; you can simply do a DIR on the file and look at
  2413.   its date/time stamp.  
  2414.  
  2415. FDATE /FF /At /Ominute# /VJulMin
  2416. REN online.log %JulMin%.log
  2417. SET JulMin=
  2418.  
  2419. HOW FDATE THINKS ABOUT DATES
  2420. ============================
  2421.  
  2422. FDATE'S BUSINESS VIEW OF THE CALENDAR
  2423. =====================================
  2424.  
  2425.   FDATE is intended for business applications, not historical ones.  
  2426.  
  2427.   FDATE does not take into account historical changes in the calendar such
  2428.   as the ten days that were dropped from the British calendar when Britain
  2429.   moved from the Julian to the Gregorian calendar in the 18th century, or
  2430.   the 11 days that were dropped from the Russian calendar when Russia made
  2431.   the same move in the early 20th century.
  2432.  
  2433.   As far as FDATE is concerned, the calendar has followed the same
  2434.   pattern, unchanged, since January 1, 0001.
  2435.  
  2436.  
  2437. FDATE'S BASE DATE
  2438. =================
  2439.   Internally, Fdate's date manipulations are based on translating a
  2440.   calendar date into an "absolute" or "TRUE Julian" date:  a date
  2441.   expressed as the number of days from some day in the distant past.
  2442.  
  2443.   FDATE's base date is January 1, 0001 (i.e. day 1 of month 1 of year 1)
  2444.   FDATE's absolute date for January 1, 0001 is      1.
  2445.   FDATE's absolute date for January 1, 1992 is 727198.
  2446.  
  2447.  
  2448. FDATE'S LEAP YEAR ALGORITHM
  2449. ===========================
  2450.     Every year evenly divisible by 4 IS a leap year
  2451.       EXCEPT THAT
  2452.         Every year evenly divisible by 100 IS NOT a leap year
  2453.           EXCEPT THAT
  2454.             Every year evenly divisible by 400 IS a leap year
  2455.     .
  2456.     Using this algorithm
  2457.          1983  is not a leap year
  2458.          1984  is     a leap year
  2459.          1900  is not a leap year
  2460.          2000  is     a leap year
  2461.  
  2462.     See "A Machine Algorithm for Processing Calendar Dates", by
  2463.          Henry F. Fliegel (Georgetown University Observatory) and
  2464.          Thomas C. Van Flandern (U.S. Naval Observatory)
  2465.          COMMUNICATIONS OF THE ACM, Volume 11, Number 10, October 1968
  2466.  
  2467. There is supposedly a new adjustment to the leapyear algorithm,
  2468. which specifies the additional exception:
  2469.  
  2470.               EXCEPT THAT
  2471.                 Every year evenly divisible by 4000 IS a leap year
  2472.  
  2473. See "Bit By Bit" column, COMPUTER LANGUAGE, November 1989, p. 148.
  2474. This adjustment is not part of FDATE's leapyear algorithm.
  2475. Unless your application is working with dates 2,000 years in the
  2476. future, the lack of this exception will be irrelevant for you.
  2477.  
  2478. FDATE'S CENTURY-ASSUMPTION ALGORITHM
  2479. ====================================
  2480. If an input date is supplied in a format in which the year is
  2481. specified without a century -- that is, as YY rather than CCYY --
  2482. then Fdate does not automatically use the current century.
  2483. Instead,
  2484.  
  2485.    *  if YY is greater than 20,       then FDATE assumes CC = 19
  2486.    *  if YY is less than or equal 20, then FDATE assumes CC = 20
  2487.  
  2488. Examples:
  2489.          21    becomes  1921
  2490.          ...
  2491.          99    becomes  1999
  2492.          00    becomes  2000
  2493.          01    becomes  2001
  2494.          ...
  2495.          20    becomes  2020
  2496. but then (again)
  2497.          21    becomes  1921
  2498.  
  2499. To put it simply, FDATE makes what would be a reasonable assumption
  2500. about the century for someone operating in the 1990's: it looks back to
  2501. 1921 and forward to 2020.  If both I and FDATE are still alive in the
  2502. year 2000, I'll probably update FDATE's century-assumption algorithm to
  2503. shift it forward several decades.
  2504.  
  2505.  
  2506. FDATE'S IMPLEMENTATION LIMITS
  2507. ====================================
  2508. Internally, numbers in Fdate are stored in Turbo Pascal's LONGINT datatype,
  2509. which means that Fdate can accept numbers up to 9 digits long.
  2510.  
  2511. DISTRIBUTION ISSUES
  2512. ===================
  2513.  
  2514. USE, REGISTRATION, AND DISTRIBUTION OF FDATE
  2515. ============================================
  2516.  
  2517. FDATE is freeware, or what is known as "zero-cost shareware".  FDATE is not
  2518. what is technically called "public domain" software because the author
  2519. retains the copyright.  FDATE can, however, be copied, used, and
  2520. distributed freely as long as FDATE.EXE and its associated doc file
  2521. (FDATE.DOC), along with its demonstration batch files and their doc files
  2522. (FDATEX.BAT, HOLIDAYS.BAT, HOLIFEDS.BAT, HOLIFEDS.DOC, TIC.BAT, ALARM.BAT,
  2523. etc.) are not altered and are distributed together.  
  2524.  
  2525. There is no requirement to register FDATE in any way.
  2526.  
  2527. FDATE can be included in shareware packages as long as both FDATE and
  2528. its related files are included in the shareware package.
  2529.  
  2530. If you have received FDATE as part of some larger shareware package,
  2531. please be aware that you may freely use, copy, and distribute FDATE
  2532. without paying a fee for, or registering, the larger package.
  2533.  
  2534. The author explicitly disavows any claim whatsoever about the
  2535. correctness or functionality of FDATE, its documentation, and its
  2536. demonstration batch files, and disclaims liability for anything and
  2537. everything bad that might happen in connection with, before, during, or
  2538. after using it.  I have tried to make FDATE work right, but everybody
  2539. makes mistakes, so you use FDATE at your own risk.
  2540.  
  2541. I don't know if people will find FDATE useful, and I'd like to find
  2542. out.  If you find FDATE useful and use it on a regular basis, I'd
  2543. appreciate it if you would drop me a short note via US mail or
  2544. CompuServe, telling me about how you are using FDATE.
  2545.  
  2546. If you need other input/output formats, please contact the author.
  2547.  
  2548.  
  2549. TECHNICAL SUPPORT FOR FDATE
  2550. ===============================================
  2551.  
  2552. Send me a message via CompuServe mail; I'll respond.  When sending your
  2553. message, please let me know what version of Fdate you're using.
  2554.  
  2555.  
  2556. WHERE TO FIND THE MOST CURRENT VERSION OF FDATE
  2557. ===============================================
  2558.  
  2559. You will always be able to find the most recent version of FDATE on
  2560. CompuServe.  The filename will be FDATE.ZIP, and it will be available in
  2561. the CIS:IBMSYS forum (library 1, the "DOS Utilities" library).
  2562.  
  2563. If you have problems finding it, try using cross-library searching, looking
  2564. for the filename FDATE.ZIP or the keyword FDATE.
  2565.  
  2566.  
  2567. UPLOADING FDATE TO ELECTRONIC BULLETIN BOARDS
  2568. ===============================================
  2569.  
  2570. Feel free to post copies of FDATE.ZIP on any BBS that you wish, but please
  2571. do not upload it to any CompuServe library.  As long as I am the only one
  2572. putting copies of FDATE onto CompuServe, we can keep confusion over
  2573. versions to a minimum.
  2574.  
  2575.  
  2576. DEMONSTRATION BATCH FILES
  2577. =========================
  2578.  
  2579. FDATE ships with a number of demonstration batch files.  These are sample
  2580. applications that illustrate some of the ways that FDATE might be used to
  2581. build applications.  They can be studied for ideas for ways of using FDATE. 
  2582. They can also be used "as is", or copied and customized to build
  2583. applications that meet your own special needs.
  2584.  
  2585.  
  2586. CONTENTS OF THE FDATE.ZIP DISTRIBUTION FILE
  2587. ===========================================
  2588.  
  2589. The current distribution package (FDATE.ZIP) contains the following:
  2590.  
  2591.        FDATE.EXE         [the FDATE program]
  2592.        FDATE.DOC         [this file, documentation for FDATE]
  2593.  
  2594.   [demonstration batch files]
  2595.        FDATEX.BAT
  2596.        HOLIDAYS.BAT
  2597.        HOLIFEDS.BAT and HOLIFEDS.DOC
  2598.        ALARM.BAT and ALARM.DOC
  2599.        TIC.BAT and TIC.DOC
  2600.  
  2601. FDATE REVISION HISTORY
  2602. ======================
  2603.  
  2604. Letters appended to version numbers indicate modifications to
  2605. the doc files, without any modification to the FDATE.EXE software.
  2606. Asterisks (*) indicate most important changes in the new version.
  2607.  
  2608. Most of the revision history before version 6.7 has been omitted, as not
  2609. being of general interest.  
  2610.  
  2611.  
  2612. 3.0a  Dec 27, 1991
  2613. *     =============== MAJOR BUG FIX ==============================
  2614. *     Fixed bug in TRUEDATE date arithmetic routine that caused
  2615. *     incorrect dates to be returned for the last 2 or 3 days of
  2616. *     some months.
  2617. *     ============================================================
  2618.  
  2619.  
  2620. 6.7a  Apr 05, 1992
  2621. *     Added function "E" (echo)
  2622. *     Added output format: "dd mn3 yy"   EXAMPLE:     05 Sep 92
  2623.       Added JDATE.BAT example batch file, thanks to Aran Spence.
  2624.       Corrected a bug in the routine that obtained command line
  2625.             parameters.  It sometimes caused an improper value to be
  2626.             returned if a quoted parameter did not contain a space.
  2627.  
  2628. 6.8a  Aug 01, 1992
  2629. *     I will no longer be posting the most recent version of FDATE
  2630.       in ZNT:UTILFORUM because ZiffNet's new fees would require me
  2631.       to pay $30/year to do so.  Look for the most recent version
  2632.       of FDATE in CIS:IBMSYS, Library 1.
  2633.  
  2634. *     Added output format:  ddmn3yy    EXAMPLE:     05Sep92
  2635.  
  2636. *     Added output format:       yy    EXAMPLE:          92
  2637.       This should make it easier for users to "roll their own"
  2638.       date formats.  See the "roll your own" example.
  2639.  
  2640. *     Modified documentation in JDATE.BAT to make it clear that it
  2641.       is working with a BUSINESS julian date format: YYjjj.
  2642.       Thanks for the feedback from  Howard S. Friedman (70720,3022)
  2643.  
  2644.       Updated FDATEX.BAT to test the new formats.
  2645.  
  2646. 6.8b   Aug 02, 1992
  2647.        Added example showing how to get last Friday's date using /Fw
  2648.  
  2649.        Modified JDATE.BAT so it describes its Julian date as a 'business
  2650.        julian' date.
  2651.  
  2652. 6.8c   Aug 07, 1992
  2653.        Revised the discussion of "tt" and "tttt" in output formats to make
  2654.        it more compact.  Again, thanks for the feedback from Howard S.
  2655.        Friedman (70720,3022).
  2656.  
  2657. 7.0a   Nov 14, 1992
  2658. *      Fixed bug in which 10-character Spanish-language month-names were
  2659.        being truncated to 9 characters.
  2660.  
  2661. *      Added #mod function
  2662.  
  2663. *      Major reformatting of documentation to make it more user-friendly
  2664.  
  2665.        Removed DO-ONCE.BAT from distribution ZIP file, as it was already
  2666.        documented in an example in this doc file.
  2667.  
  2668.        Added HOLIFEDS.BAT and HOLIFEDS.DOC to the distribution ZIP file. 
  2669.        Calculates Federal holidays in a given year.
  2670.  
  2671. VERSION 7.3a RELEASED
  2672.      
  2673. 7.0b   Dec 15, 1992
  2674.        Corrected last few lines of HOLIFEDS.DOC, which referred to
  2675.        Dec 24, 1964 as a Friday.  It was a Thursday.
  2676.  
  2677. 7.1a   Apr 15, 1993
  2678.        Added German language parm (/Lgr).  Thanks for the request, and the
  2679.        necessary information, from Patrick Schmucki, via the Active-Net
  2680.        BBS in Rapperswil, Switzerland.
  2681.  
  2682. 7.1b   Apr 20, 1993
  2683.        Added LASTDAY.BAT example.  Thanks to Patrick Boyle for the request
  2684.        for an explanation of how this might be done.
  2685.  
  2686. 7.1c   Apr 28, 1993
  2687.        In an attempt to improve the helpfulness of the documentation,
  2688.        moved the detailed description of functions closer to the beginning
  2689.        of this doc file, and added a one-page OVERVIEW OF FUNCTIONS.
  2690.  
  2691. 7.2a   May 1, 1993
  2692.        Corrected German-language name for month of March from "Mrz" to
  2693.        "März"
  2694.  
  2695. 7.3a   May 25, 1993
  2696.        Added output formats "zd. mn ccyy" and "zd. mn3 ccyy" for the
  2697.        convenience of German-speaking users.  Thanks for the request from
  2698.        Patrick Schmucki.
  2699.  
  2700.        Added output format ZM.
  2701.  
  2702.        To this .DOC file, added: 
  2703.        Examples of how to represent a date in 4 bytes, along with the text
  2704.        of SETXX.BAT, and example of how to get information about the month
  2705.        prior to the current month.  Thanks to Richard Beels for the
  2706.        request for ideas on how to do this sort of thing.
  2707.  
  2708.  
  2709. 7.3b   May 29, 1993
  2710.        To this .DOC file, added: 
  2711.        Example of how to use a batch file (FERGIAN.BAT) to customize Fdate
  2712.        for a different language, using a technique similar to SETXX.BAT. 
  2713.        Thanks to Sebastian Bazley, of the Higher Education National
  2714.        Software Archive at Lancaster University, UK, for suggestions that
  2715.        got me started thinking along these lines.  
  2716.  
  2717. VERSION 7.3b RELEASED
  2718.  
  2719. 7.4a   July 7, 1993
  2720. *      Add "V" (validate) function: /Fv
  2721.  
  2722.        Restructured HELP screen into several screens, because the single
  2723.        HELP screen was getting too crowded.
  2724.  
  2725. 7.5a   July 9, 1993
  2726.        Added error checking for input dates that contain a month
  2727.        specification that is less than 1 or greater than 12
  2728.  
  2729. 7.6a   July 9, 1993
  2730.        Added "m" (month addition/subtraction) function: /Fm
  2731.  
  2732. 7.7a   July 10, 1993
  2733.        Added "#mult" (multiplication) function: /F#mult
  2734.        Added "#div" ( division) function: /F#div
  2735.        Added "#idiv" (integer division) function: /F#idiv
  2736.  
  2737. 7.8a   July 14, 1993
  2738.        Added /T (time) parameter
  2739.  
  2740.        Changed value that /Fv produces for an OK date from "OK" to the
  2741.        null string.  This should make it a little easier to use.
  2742.  
  2743.        Removed the TIMER demo from FDATEX.BAT, since it is now in this DOC
  2744.        file.
  2745.  
  2746. 7.9a   July 15, 1993
  2747.        Minor change to the monthly arithmetic code to improve clarity
  2748.  
  2749.        Added error-trapping routines for numeric input parameters that
  2750.        exceed 9 digits, and for results of multiplication operations that
  2751.        overflow limits of Turbo Pascal's LONGINT datatype
  2752.  
  2753. 8.0a   July 15, 1993
  2754.        Added FORATIME.BAT example, which Walter Ledge (assistant sysop of
  2755.        CompuServe's CRFORUM) and I developed.  A big thanks to Walt for
  2756.        his feedback, which provided the spark I needed to add the /Time
  2757.        parameter and the #idiv function.
  2758.  
  2759.        Added JDATE.BAT to the list of examples in this doc file, and
  2760.        removed it from the files included in the .ZIP distribution file.
  2761.  
  2762. VERSION 8.0a RELEASED
  2763.  
  2764. 8.1a   July 27, 1993
  2765.        Bug fix.
  2766.        An error error-trapping routine that was added to Fdate version 7.9
  2767.        contained a bug caused in part by a programmer error and in part by
  2768.        some extremely strange behavior of the Turbo Pascal compiler
  2769.        itself.  The bug caused of Fdate's numeric math functions (#add,
  2770.        #dif, #mult, #div, #idiv, #mod, #comp, etc.) -- all of which use
  2771.        the new error-trapping routine -- to return incorrect results. 
  2772.        Thanks to Bob Schuchman for the quick bug report.
  2773.        
  2774. VERSION 8.1a RELEASED
  2775.  
  2776. 8.1b   August 6, 1993
  2777.        Removed FILEDATE.BAT from the distribution .ZIP file.
  2778.        Added OLDFILES.BAT, a simplified version, to this .DOC file
  2779.  
  2780. 8.1c   August 8, 1993
  2781.        Added commentary on OLDFILES.BAT.  
  2782.  
  2783. 8.2a   August 13, 1993
  2784.        Corrected the Spanish and French "full" and "d1" output formats. 
  2785.        Thanks for the information on Spanish and French date formats to
  2786.        Gene J. Raymond, of GJR Software Products.
  2787.  
  2788. VERSION 8.2a RELEASED