home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_GEN / EDSV4064.ZIP / EPP-V1_1.ZIP / SYSDATE.E < prev    next >
Text File  |  1993-06-26  |  3KB  |  103 lines

  1. /* NOTE:  sd_init () is called automatically. */
  2.  
  3. /* Holds a julian date.  These are easiest to perform calculations with. */
  4. OBJECT sd_julianDateType
  5.   year, day
  6. ENDOBJECT
  7.  
  8.  
  9. DEF sd_month_BeginDay = NIL,  /* Day of year that month starts on. */
  10.     sd_monthName [12] : ARRAY OF LONG  /* String values for months.       */
  11.  
  12.  
  13. PROC sd_isLeapYear (year) RETURN (Mod (year, 4) = 0)
  14.  
  15.  
  16. PROC sd_init ()
  17.   sd_month_BeginDay := [  1,  32,  60,  91, 121, 152,
  18.                         182, 213, 244, 274, 305, 335]
  19.   sd_monthName [ 0] := 'January'
  20.   sd_monthName [ 1] := 'February'
  21.   sd_monthName [ 2] := 'March'
  22.   sd_monthName [ 3] := 'April'
  23.   sd_monthName [ 4] := 'May'
  24.   sd_monthName [ 5] := 'June'
  25.   sd_monthName [ 6] := 'July'
  26.   sd_monthName [ 7] := 'August'
  27.   sd_monthName [ 8] := 'September'
  28.   sd_monthName [ 9] := 'October'
  29.   sd_monthName [10] := 'November'
  30.   sd_monthName [11] := 'December'
  31. ENDPROC
  32.   /* sd_init */
  33.  
  34.  
  35. PROC sd_monthFrom (julianDate : PTR TO sd_julianDateType)
  36.   DEF day, m
  37.   IF sd_month_BeginDay = NIL THEN sd_init ()
  38.   day := julianDate.day
  39.   IF day < Long (sd_month_BeginDay + 4) THEN RETURN 1
  40.   IF sd_isLeapYear (julianDate.year) THEN DEC day
  41.   FOR m := 2 TO 11
  42.     IF day < Long (sd_month_BeginDay + (Mul (m, 4))) THEN RETURN m
  43.   ENDFOR
  44. ENDPROC  m
  45.   /* sd_monthFrom */
  46.  
  47. PROC sd_monthNameFor (monthNumber) RETURN sd_monthName [monthNumber - 1]
  48.   /* Month number must be 1-12.  Can be gotten via sd_monthFrom(). */
  49.  
  50.  
  51. PROC sd_dayOfMonthFrom (julianDate : PTR TO sd_julianDateType)
  52.   /* Variables used here for readability. */
  53.   DEF today, month, month_BeginDay, leapYearAdjustment = 0
  54.   today := julianDate.day
  55.   month := sd_monthFrom (julianDate)
  56.   month_BeginDay := Long (sd_month_BeginDay + Mul ((month-1), 4))
  57.   IF (sd_isLeapYear (julianDate.year)) AND (month > 2) THEN DEC leapYearAdjustment
  58.   RETURN (today - month_BeginDay + 1 + leapYearAdjustment)
  59. ENDPROC
  60.   /* sd_dayOfMonthFrom */
  61.  
  62. PROC sd_add (julianDate : PTR TO sd_julianDateType,
  63.              numberOfDays)
  64.   /* Add any number of days (within reason) to a julian date. Returns the */
  65.   /* computed julian date.  The parameter julianDate is unmodified.       */
  66.   DEF computedJulianDate : sd_julianDateType,
  67.       newNumberOfDays
  68.   IF sd_month_BeginDay = NIL THEN sd_init ()
  69.   IF ((sd_isLeapYear (julianDate.year) = FALSE) AND
  70.       (julianDate.day + numberOfDays <= 365)) OR
  71.      ((sd_isLeapYear (julianDate.year)) AND
  72.       (julianDate.day + numberOfDays <= 365))
  73.     computedJulianDate.year := julianDate.year
  74.     computedJulianDate.day := julianDate.day + numberOfDays
  75.   ELSE
  76.     computedJulianDate.year := julianDate.year + 1
  77.     computedJulianDate.day := 1;
  78.     IF sd_isLeapYear (julianDate.year) = FALSE
  79.       newNumberOfDays := numberOfDays - (365 - julianDate.day + 1)
  80.     ELSE
  81.       newNumberOfDays := numberOfDays - (366 - julianDate.day + 1)
  82.     ENDIF
  83.     RETURN sd_add (computedJulianDate, newNumberOfDays)
  84.   ENDIF
  85. ENDPROC  computedJulianDate
  86.   /* sd_add */
  87.  
  88.  
  89. PROC sd_getCurrentDate (julianDate : PTR TO sd_julianDateType)
  90. /* Parameter julianDate must not be NIL! */
  91.   DEF ds : datestamp,
  92.       baseDate : sd_julianDateType,
  93.       currentDate : PTR TO sd_julianDateType
  94.   VOID DateStamp (ds)
  95.   baseDate.year := 1978  /* All dates are derived from this year. */
  96.   baseDate.day := 1      /* 1 January (julian format).            */
  97.   currentDate := sd_add (baseDate, ds.days)
  98.   julianDate.year := currentDate.year
  99.   julianDate.day := currentDate.day
  100. ENDPROC  julianDate
  101.   /* sd_getCurrentDate */
  102.  
  103.