;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Apr 2000
;;;;
-;;;; $Id$
-;;;;
;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;;
;;;; KMRCL users are granted the rights to distribute and use this software
year
hr min sec))))
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (defconstant +minute-seconds+ 60)
+ (defconstant +hour-seconds+ (* 60 +minute-seconds+))
+ (defconstant +day-seconds+ (* 24 +hour-seconds+))
+ (defconstant +week-seconds+ (* +day-seconds+ 7))
+ (defconstant +month-seconds+ (* +day-seconds+ (/ 365.25 12)))
+ (defconstant +year-seconds+ (* +day-seconds+ 365.25)))
+
+(defun seconds-to-condensed-time-string (sec &key (dp-digits 0))
+ "Prints a quantity of seconds as a condensed string. DP-DIGITS controls
+how many digits after decimal point."
+ (multiple-value-bind (year yrem) (floor (coerce sec 'double-float) +year-seconds+)
+ (multiple-value-bind (month mrem) (floor yrem +month-seconds+)
+ (multiple-value-bind (week wrem) (floor mrem +week-seconds+)
+ (multiple-value-bind (day drem) (floor wrem +day-seconds+)
+ (multiple-value-bind (hour hrem) (floor drem +hour-seconds+)
+ (multiple-value-bind (minute minrem) (floor hrem +minute-seconds+)
+ (let ((secstr (if (zerop dp-digits)
+ (format nil "~Ds" (round minrem))
+ (format nil (format nil "~~,~DFs" dp-digits) minrem))))
+ (cond
+ ((plusp year)
+ (format nil "~Dy~DM~Dw~Dd~Dh~Dm~A" year month week day hour minute secstr))
+ ((plusp month)
+ (format nil "~DM~Dw~Dd~Dh~Dm~A" month week day hour minute secstr))
+ ((plusp week)
+ (format nil "~Dw~Dd~Dh~Dm~A" week day hour minute secstr))
+ ((plusp day)
+ (format nil "~Dd~Dh~Dm~A" day hour minute secstr))
+ ((plusp hour)
+ (format nil "~Dh~Dm~A" hour minute secstr))
+ ((plusp minute)
+ (format nil "~Dm~A" minute secstr))
+ (t
+ secstr))))))))))
+
(defun print-seconds (secs)
(print-float-units secs "sec"))
(defun day-of-week (year month day)
"Day of week calculation using Zeller's Congruence.
-Input: The year y, month m (1 ≤ m ≤ 12) and day d (1 ≤ d ≤ 31).
+Input: The year y, month m (1 <= m <= 12) and day d (1 <= d <= 31).
Output: n - the day of the week (Sunday = 0, Saturday = 6)."
(when (< month 3)