;;; time-date.el --- Date and time handling functions
-;; Copyright (C) 1998 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu Umeda <umerin@mse.kyutech.ac.jp>
+;; Keywords: mail news util
+
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
;;; Code:
-(eval-and-compile
- (eval
- '(if (not (string-match "XEmacs" emacs-version))
- (require 'parse-time)
-
- (require 'timezone)
- (defun parse-time-string (date)
- "Convert DATE into time."
- (decode-time
- (condition-case ()
- (let* ((d1 (timezone-parse-date date))
- (t1 (timezone-parse-time (aref d1 3))))
- (apply 'encode-time
- (mapcar (lambda (el)
- (and el (string-to-number el)))
- (list
- (aref t1 2) (aref t1 1) (aref t1 0)
- (aref d1 2) (aref d1 1) (aref d1 0)
- (number-to-string
- (* 60 (timezone-zone-to-minute (aref d1 4))))))))
- ;; If we get an error, then we just return a 0 time.
- (error (list 0 0))))))))
+(require 'parse-time)
+
+(autoload 'timezone-make-date-arpa-standard "timezone")
+;;;###autoload
(defun date-to-time (date)
"Convert DATE into time."
- (apply 'encode-time (parse-time-string date)))
-
-(defun time-to-float (time)
+ (condition-case ()
+ (apply 'encode-time
+ (parse-time-string
+ ;; `parse-time-string' isn't sufficiently general or
+ ;; robust. It fails to grok some of the formats that
+ ;; timzeone does (e.g. dodgy post-2000 stuff from some
+ ;; Elms) and either fails or returns bogus values. Lars
+ ;; reverted this change, but that loses non-trivially
+ ;; often for me. -- fx
+ (timezone-make-date-arpa-standard date)))
+ (error (error "Invalid date: %s" date))))
+
+(defun time-to-seconds (time)
"Convert TIME to a floating point number."
(+ (* (car time) 65536.0)
- (cadr time)))
+ (cadr time)
+ (/ (or (nth 2 time) 0) 1000000.0)))
-(defun float-to-time (float)
- "Convert FLOAT (a floating point number) to an Emacs time structure."
- (list (floor float 65536)
- (floor (mod float 65536))))
+(defun seconds-to-time (seconds)
+ "Convert SECONDS (a floating point number) to an Emacs time structure."
+ (list (floor seconds 65536)
+ (floor (mod seconds 65536))
+ (floor (* (- seconds (ffloor seconds)) 1000000))))
(defun time-less-p (t1 t2)
"Say whether time T1 is less than time T2."
(defun date-to-day (date)
"Return the number of days between year 1 and DATE."
- (time-to-day (date-to-time date)))
-
+ (time-to-days (date-to-time date)))
+
(defun days-between (date1 date2)
"Return the number of days between DATE1 and DATE2."
(- (date-to-day date1) (date-to-day date2)))
(setq day-of-year (1+ day-of-year))))
day-of-year))
-(defun time-to-day (time)
+(defun time-to-days (time)
"The number of days between the Gregorian date 0001-12-31bce and TIME.
The Gregorian date Sunday, December 31, 1bce is imaginary."
(let* ((tim (decode-time time))
(- (/ (1- year) 100)) ; - century years
(/ (1- year) 400)))) ; + Gregorian leap years
+(defun time-to-number-of-days (time)
+ "Return the number of days represented by TIME.
+The number of days will be returned as a floating point number."
+ (/ (+ (* 1.0 65536 (car time)) (cadr time)) (* 60 60 24)))
+
+;;;###autoload
+(defun safe-date-to-time (date)
+ "Parse DATE and return a time structure.
+If DATE is malformed, a zero time will be returned."
+ (condition-case ()
+ (date-to-time date)
+ (error '(0 0))))
+
(provide 'time-date)
;;; time-date.el ends here