Dates.txt 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. MODULE Dates;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 System/Mod/Dates.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT Kernel;
  5. CONST
  6. monday* = 0;
  7. tuesday* = 1;
  8. wednesday* = 2;
  9. thursday* = 3;
  10. friday* = 4;
  11. saturday* = 5;
  12. sunday* = 6;
  13. short* = 0;
  14. long* = 1;
  15. abbreviated* = 2;
  16. plainLong* = 3;
  17. plainAbbreviated* = 4;
  18. TYPE
  19. Date* = RECORD
  20. year*, month*, day*: INTEGER
  21. END;
  22. Time* = RECORD
  23. hour*, minute*, second*: INTEGER
  24. END;
  25. Hook* = POINTER TO ABSTRACT RECORD (Kernel.Hook) END;
  26. VAR M, N: ARRAY 8 OF INTEGER; hook: Hook;
  27. PROCEDURE (h: Hook) GetTime* (OUT d: Date; OUT t: Time), NEW, ABSTRACT;
  28. PROCEDURE (h: Hook) GetUTCTime* (OUT d: Date; OUT t: Time), NEW, ABSTRACT;
  29. PROCEDURE (h: Hook) GetUTCBias* (OUT bias: INTEGER), NEW, ABSTRACT;
  30. PROCEDURE (h: Hook) DateToString* (d: Date; format: INTEGER; OUT str: ARRAY OF CHAR), NEW, ABSTRACT;
  31. PROCEDURE (h: Hook) TimeToString* (t: Time; OUT str: ARRAY OF CHAR), NEW, ABSTRACT;
  32. PROCEDURE SetHook* (h: Hook);
  33. BEGIN
  34. hook := h
  35. END SetHook;
  36. PROCEDURE ValidTime* (IN t: Time): BOOLEAN;
  37. BEGIN
  38. RETURN
  39. (t.hour >= 0) & (t.hour <= 23)
  40. & (t.minute >= 0) & (t.minute <= 59)
  41. & (t.second >= 0) & (t.second <= 59)
  42. END ValidTime;
  43. PROCEDURE ValidDate* (IN d: Date): BOOLEAN;
  44. VAR y, m, d1: INTEGER;
  45. BEGIN
  46. IF (d.year < 1) OR (d.year > 9999) OR (d.month < 1) OR (d.month > 12) OR (d.day < 1) THEN
  47. RETURN FALSE
  48. ELSE
  49. y := d.year; m := d.month;
  50. IF m = 2 THEN
  51. IF (y < 1583) & (y MOD 4 = 0)
  52. OR (y MOD 4 = 0) & ((y MOD 100 # 0) OR (y MOD 400 = 0)) THEN
  53. d1 := 29
  54. ELSE d1 := 28
  55. END
  56. ELSIF m IN {1, 3, 5, 7, 8, 10, 12} THEN d1 := 31
  57. ELSE d1 := 30
  58. END;
  59. IF (y = 1582) & (m = 10) & (d.day > 4) & (d.day < 15) THEN RETURN FALSE END;
  60. RETURN d.day <= d1
  61. END
  62. END ValidDate;
  63. PROCEDURE Day* (IN d: Date): INTEGER;
  64. VAR y, m, n: INTEGER;
  65. BEGIN
  66. y := d.year; m := d.month - 3;
  67. IF m < 0 THEN INC(m, 12); DEC(y) END;
  68. n := y * 1461 DIV 4 + (m * 153 + 2) DIV 5 + d.day - 306;
  69. IF n > 577737 THEN n := n - (y DIV 100 * 3 - 5) DIV 4 END;
  70. RETURN n
  71. END Day;
  72. PROCEDURE DayToDate* (n: INTEGER; OUT d: Date);
  73. VAR c, y, m: INTEGER;
  74. BEGIN
  75. IF n > 577737 THEN
  76. n := n * 4 + 1215; c := n DIV 146097; n := n MOD 146097 DIV 4
  77. ELSE
  78. n := n + 305; c := 0
  79. END;
  80. n := n * 4 + 3; y := n DIV 1461; n := n MOD 1461 DIV 4;
  81. n := n * 5 + 2; m := n DIV 153; n := n MOD 153 DIV 5;
  82. IF m > 9 THEN m := m - 12; INC(y) END;
  83. d.year := SHORT(100 * c + y);
  84. d.month := SHORT(m + 3);
  85. d.day := SHORT(n + 1)
  86. END DayToDate;
  87. PROCEDURE GetDate* (OUT d: Date);
  88. VAR t: Time;
  89. BEGIN
  90. ASSERT(hook # NIL, 100);
  91. hook.GetTime(d, t)
  92. END GetDate;
  93. PROCEDURE GetTime* (OUT t: Time);
  94. VAR d: Date;
  95. BEGIN
  96. ASSERT(hook # NIL, 100);
  97. hook.GetTime(d, t)
  98. END GetTime;
  99. (* UTC = Coordinated Universal Time, also konown as Greenwich Mean time (GMT). *)
  100. PROCEDURE GetUTCDate* (OUT d: Date);
  101. VAR t: Time;
  102. BEGIN
  103. ASSERT(hook # NIL, 100);
  104. hook.GetUTCTime(d, t)
  105. END GetUTCDate;
  106. PROCEDURE GetUTCTime* (OUT t: Time);
  107. VAR d: Date;
  108. BEGIN
  109. ASSERT(hook # NIL, 100);
  110. hook.GetUTCTime(d, t)
  111. END GetUTCTime;
  112. PROCEDURE GetUTCBias* (OUT bias: INTEGER);
  113. (*
  114. Returns the current bias, in minutes, for local time translation on this computer. The bias is the difference,
  115. in minutes, between Coordinated Universal Time (UTC) and local time. All translations between UTC and
  116. local time are based on the following formula:
  117. UTC = local time + bias
  118. *)
  119. BEGIN
  120. ASSERT(hook # NIL, 100);
  121. hook.GetUTCBias(bias)
  122. END GetUTCBias;
  123. PROCEDURE GetEasterDate* (year: INTEGER; OUT d: Date);
  124. VAR k, m, n, a, b, c, d0, e, o: INTEGER; month, day: INTEGER;
  125. BEGIN
  126. ASSERT((year >= 1583) & (year <= 2299), 20);
  127. k := year DIV 100 - 15;
  128. m := M[k]; n := N[k];
  129. a := year MOD 19; b := year MOD 4; c := year MOD 7;
  130. d0 := (19*a + m) MOD 30; e := (2*b+4*c+6*d0+n) MOD 7;
  131. o := 21+d0+e; month := 3+o DIV 31; day := o MOD 31+1;
  132. IF month = 4 THEN
  133. IF day = 26 THEN day := 19
  134. ELSIF (day = 25) & (d0=28) & (e = 6) & (a > 10) THEN day := 18
  135. END
  136. END;
  137. d.year := year;
  138. d.month := month;
  139. d.day := day
  140. END GetEasterDate;
  141. PROCEDURE DayOfWeek* (IN d: Date): INTEGER;
  142. (** post: res = 0: Monday .. res = 6: Sunday **)
  143. BEGIN
  144. RETURN SHORT((4+Day(d)) MOD 7)
  145. END DayOfWeek;
  146. PROCEDURE DateToString* (IN d: Date; format: INTEGER; OUT str: ARRAY OF CHAR);
  147. BEGIN
  148. ASSERT(hook # NIL, 100);
  149. hook.DateToString(d, format, str)
  150. END DateToString;
  151. PROCEDURE TimeToString* (IN t: Time; OUT str: ARRAY OF CHAR);
  152. BEGIN
  153. ASSERT(hook # NIL, 100);
  154. hook.TimeToString(t, str)
  155. END TimeToString;
  156. BEGIN
  157. M[0] := 22; N[0] := 2;
  158. M[1] := 22; N[1] := 2;
  159. M[2] := 23; N[2] := 3;
  160. M[3] := 23; N[3] := 4;
  161. M[4] := 24; N[4] := 5;
  162. M[5] := 24; N[5] := 5;
  163. M[6] := 24; N[6] := 6;
  164. M[7] := 25; N[7] := 0;
  165. END Dates.