;;;; 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
(decode-universal-time
(encode-universal-time s m hour day month year))
(values (elt '("Monday" "Tuesday" "Wednesday" "Thursday"
- "Friday" "Saturday" "Sunday")
- wkday)
- (elt '("January" "February" "March" "April" "May" "June"
- "July" "August" "September" "October" "November"
- "December")
- (1- mn))
- (format nil "~A" dy) (format nil "~A" yr)
- (format nil "~2,'0D:~2,'0D:~2,'0D" hr min sec))))
-
-
-(defun date-string (ut)
+ "Friday" "Saturday" "Sunday")
+ wkday)
+ (elt '("January" "February" "March" "April" "May" "June"
+ "July" "August" "September" "October" "November"
+ "December")
+ (1- mn))
+ (format nil "~A" dy)
+ (format nil "~A" yr)
+ (format nil "~2,'0D:~2,'0D:~2,'0D" hr min sec))))
+
+(defun pretty-date-ut (&optional (tm (get-universal-time)))
+ (multiple-value-bind (sec min hr dy mn yr) (decode-universal-time tm)
+ (pretty-date yr mn dy hr min sec)))
+
+(defun date-string (&optional (ut (get-universal-time)))
(if (typep ut 'integer)
(multiple-value-bind (sec min hr day mon year dow daylight-p zone)
- (decode-universal-time ut)
- (declare (ignore daylight-p zone))
- (format nil "~[Mon~;Tue~;Wed~;Thu~;Fri~;Sat~;Sun~], ~d ~[Jan~;Feb~;Mar~;Apr~;May~;Jun~;Jul~;Aug~;Sep~;Oct~;Nov~;Dec~] ~d ~2,'0d:~2,'0d:~2,'0d"
- dow
- day
- (1- mon)
- year
- hr min sec))))
+ (decode-universal-time ut)
+ (declare (ignore daylight-p zone))
+ (format nil "~[Mon~;Tue~;Wed~;Thu~;Fri~;Sat~;Sun~] ~d ~[Jan~;Feb~;Mar~;Apr~;May~;Jun~;Jul~;Aug~;Sep~;Oct~;Nov~;Dec~] ~d ~2,'0d:~2,'0d:~2,'0d"
+ dow
+ day
+ (1- mon)
+ year
+ hr min sec))))
(defun print-seconds (secs)
(print-float-units secs "sec"))
(defun posix-time-to-utime (time)
(+ time +posix-epoch+))
-;;;; Daylight Saving Time calculations
+(defun utime-to-posix-time (utime)
+ (- utime +posix-epoch+))
+
+;; Monthnames taken from net-telent-date to support lml2
+
+(defvar *monthnames*
+ '((1 . "January")
+ (2 . "February")
+ (3 . "March")
+ (4 . "April")
+ (5 . "May")
+ (6 . "June")
+ (7 . "July")
+ (8 . "August")
+ (9 . "September")
+ (10 . "October")
+ (11 . "November")
+ (12 . "December")))
+
+(defun monthname (stream arg colon-p at-p &optional width (mincol 0) (colinc 1) (minpad 0) (padchar #\Space))
+ "Print the name of the month (1=January) corresponding to ARG on STREAM. This is intended for embedding in a FORMAT directive: WIDTH governs the number of characters of text printed, MINCOL, COLINC, MINPAD, PADCHAR work as for ~A"
+ (declare (ignore colon-p))
+ (let ((monthstring (cdr (assoc arg *monthnames*))))
+ (if (not monthstring) (return-from monthname nil))
+ (let ((truncate (if width (min width (length monthstring)) nil)))
+ (format stream
+ (if at-p "~V,V,V,V@A" "~V,V,V,VA")
+ mincol colinc minpad padchar
+ (subseq monthstring 0 truncate)))))
+
+(defconstant* +zellers-adj+ #(0 3 2 5 0 3 5 1 4 6 2 4))
+
+(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).
+Output: n - the day of the week (Sunday = 0, Saturday = 6)."
+
+ (when (< month 3)
+ (decf year))
+ (mod
+ (+ year (floor year 4) (- (floor year 100)) (floor year 400)
+ (aref +zellers-adj+ (1- month)) day)
+ 7))
+
+;;;; Daylight Saving Time calculations
;; Daylight Saving Time begins for most of the United States at 2
;; a.m. on the first Sunday of April. Time reverts to standard time at
;; 2007 April 1 October 28 March 25 October 28
;; 2008 April 6 October 26 March 30 October 26
+