From: eggert@twinsun.COM (Paul Eggert)
Subject: gnus 3.14.1 mishandles timezones that are not on hour boundaries
Organization: GNUs Not Usenet
Distribution: gnu
Date: Tue, 5 Jan 1993 05:33:24 GMT

GNUS 3.14.1 assumes that time zones differ from GMT by an integral number of
hours.  This doesn't work for India, which is GMT +0530.  Here's a patch.


===================================================================
RCS file: timezone.el,v
retrieving revision 3.14.1.1
retrieving revision 3.14.1.2
diff -c -r3.14.1.1 -r3.14.1.2
*** timezone.el	1993/01/04 22:49:05	3.14.1.1
--- timezone.el	1993/01/04 23:38:51	3.14.1.2
***************
*** 66,75 ****
  	 (second (string-to-int (aref time 2)))
  	 (local  (or (aref date 4) local)) ;Use original if defined
  	 (timezone (or timezone local))
! 	 (diff   (- (timezone-zone-to-hour timezone)
! 		    (timezone-zone-to-hour local)))
  	 (new    (timezone-fix-time year month day
! 				    (+ hour diff) minute second)))
      (timezone-make-arpa-date (aref new 0) (aref new 1) (aref new 2)
  			     (timezone-make-time-string
  			      (aref new 3) (aref new 4) (aref new 5))
--- 66,75 ----
  	 (second (string-to-int (aref time 2)))
  	 (local  (or (aref date 4) local)) ;Use original if defined
  	 (timezone (or timezone local))
! 	 (diff   (- (timezone-zone-to-minute timezone)
! 		    (timezone-zone-to-minute local)))
  	 (new    (timezone-fix-time year month day
! 				    hour (+ minute diff) second)))
      (timezone-make-arpa-date (aref new 0) (aref new 1) (aref new 2)
  			     (timezone-make-time-string
  			      (aref new 3) (aref new 4) (aref new 5))
***************
*** 90,99 ****
  	 (second (string-to-int (aref time 2)))
  	 (local  (or (aref date 4) local)) ;Use original if defined
  	 (timezone (or timezone local))
! 	 (diff   (- (timezone-zone-to-hour timezone)
! 		    (timezone-zone-to-hour local)))
  	 (new    (timezone-fix-time year month day
! 				    (+ hour diff) minute second)))
      (timezone-make-sortable-date (aref new 0) (aref new 1) (aref new 2)
  				 (timezone-make-time-string
  				  (aref new 3) (aref new 4) (aref new 5)))
--- 90,99 ----
  	 (second (string-to-int (aref time 2)))
  	 (local  (or (aref date 4) local)) ;Use original if defined
  	 (timezone (or timezone local))
! 	 (diff   (- (timezone-zone-to-minute timezone)
! 		    (timezone-zone-to-minute local)))
  	 (new    (timezone-fix-time year month day
! 				    hour (+ minute diff) second)))
      (timezone-make-sortable-date (aref new 0) (aref new 1) (aref new 2)
  				 (timezone-make-time-string
  				  (aref new 3) (aref new 4) (aref new 5)))
***************
*** 210,217 ****
  
  ;; Miscellaneous
  
! (defun timezone-zone-to-hour (timezone)
!   "Translate TIMEZONE (in zone name or integer) to integer hour."
    (if timezone
        (progn
  	(setq timezone
--- 210,217 ----
  
  ;; Miscellaneous
  
! (defun timezone-zone-to-minute (timezone)
!   "Translate TIMEZONE (in zone name or integer) to integer minute."
    (if timezone
        (progn
  	(setq timezone
***************
*** 220,230 ****
  		  timezone))
  	(if (stringp timezone)
  	    (setq timezone (string-to-int timezone)))
! 	(/ timezone 100))
      0))
  
  (defun timezone-fix-time (year month day hour minute second)
    "Fix date and time."
    (cond ((<= 24 hour)			;24 -> 00
  	 (setq hour (- hour 24))
  	 (setq day  (1+ day))
--- 220,235 ----
  		  timezone))
  	(if (stringp timezone)
  	    (setq timezone (string-to-int timezone)))
! 	(let* ((abszone (max timezone (- timezone)))
! 	       (minutes (+ (* 60 (/ abszone 100)) (% abszone 100))))
! 	  (if (< timezone 0) (- minutes) minutes)))
      0))
  
  (defun timezone-fix-time (year month day hour minute second)
    "Fix date and time."
+   (let ((hourfix (if (< minute 0) (- (/ (- 59 minute) 60)) (/ minute 60))))
+     (setq hour (+ hour hourfix))
+     (setq minute (- minute (* 60 hourfix))))
    (cond ((<= 24 hour)			;24 -> 00
  	 (setq hour (- hour 24))
  	 (setq day  (1+ day))
Newsgroups: gnu.emacs.gnus