Re: encode-universal-time bug?
Gary Byers <[email protected]> Thu, 19 Sep 2002 13:59:48 -0600 (MDT)
| Newsgroups | gmane.lisp.openmcl.devel,gmane.lisp.openmcl.bugs |
|---|---|
| Message-ID | <[email protected]> |
On Thu, 19 Sep 2002, Gary Byers wrote: > > > On Thu, 19 Sep 2002, John DeSoi wrote: > > > ? (encode-universal-time 0 0 0 1 1 1900) > > > Error: value -2208988800 is not of the expected type INTEGER. > > Not exactly a sensible error message, either. I still haven't fixed that. > > > > While executing: CCL::GET-TIMEZONE > > > Type :POP to abort. > > > > > > On MCL this returns 18000 > > Clearly, one of us is in the wrong time zone: ? (encode-universal-time 0 0 0 1 1 1900) 25200 > > Best, > > Thanks. > > Inspecting/describing a small integer fails, quite possibly becuase of > the same bug. > > > > > John DeSoi, Ph.D. > > > > _______________________________________________ > > Openmcl-devel mailing list > > [email protected] > > http://clozure.com/cgi-bin/mailman/listinfo/openmcl-devel > > > > > > > _______________________________________________ > Openmcl-devel mailing list > [email protected] > http://clozure.com/cgi-bin/mailman/listinfo/openmcl-devel > >
get-timezone.diff
(text/plain, 1.6 KB)
Index: lib/time.lisp
===================================================================
RCS file: /usr/local/publiccvs/ccl/lib/time.lisp,v
retrieving revision 1.4
diff -u -r1.4 time.lisp
--- lib/time.lisp 15 Jan 2002 23:43:37 -0000 1.4
+++ lib/time.lisp 19 Sep 2002 19:50:42 -0000
@@ -47,13 +47,23 @@
(#_gettimeofday tv (%null-ptr))
(+ (pref tv :timeval.tv_sec) unix-to-universal-time)))
+;;; This should stop using #_localtime: not all times can be represented
+;;; as a 32-bit offset from the start of Unix time, and (more importantly)
+;;; #_localtime isn't reentrant.
+;;; For now, if the time won't fit in 32 bits, use an arbitrary time
+;;; value to get the time zone and assume that DST was -not- in effect.
(defun get-timezone (time)
- (rlet ((when :long))
- (setf (%get-long when) time)
- (without-interrupts ;reentrancy ?
- (with-macptrs ((ltm (#_localtime when)))
- (values (floor (pref ltm :tm.tm_gmtoff) -60)
- (not (zerop (pref ltm :tm.tm_isdst))))))))
+ (let* ((toobig (not (or (typep time '(unsigned-byte 32))
+ (typep time '(signed-byte 32))))))
+ (when toobig
+ (setq time 0))
+ (rlet ((when :long))
+ (setf (%get-long when) time)
+ (without-interrupts ;reentrancy ?
+ (with-macptrs ((ltm (#_localtime when)))
+ (values (floor (pref ltm :tm.tm_gmtoff) -60)
+ (unless toobig (not (zerop (pref ltm :tm.tm_isdst))))))))))
+
(defun decode-universal-time (universal-time &optional time-zone)
"Converts a universal-time to decoded time format returning the following