From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: thunk2@arcor.de (Thomas Plass) Newsgroups: gmane.emacs.bugs Subject: bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling Date: Mon, 18 Feb 2019 10:36:29 +0100 Message-ID: <23658.31901.831381.517915@AGAME7.local> References: <23640.9851.562972.730234@AGAME7.local> <875ztog7hx.fsf@panama> <87wom1otsw.fsf@panama> Reply-To: Thomas Plass Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="XqqZEn2pcU" Content-Transfer-Encoding: 7bit Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="240827"; mail-complaints-to="usenet@blaine.gmane.org" Cc: 34315@debbugs.gnu.org To: Ulf Jasper Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Feb 18 10:37:17 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gvfMT-0010Wb-5X for geb-bug-gnu-emacs@m.gmane.org; Mon, 18 Feb 2019 10:37:17 +0100 Original-Received: from localhost ([127.0.0.1]:55383 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gvfMS-0001p6-3g for geb-bug-gnu-emacs@m.gmane.org; Mon, 18 Feb 2019 04:37:16 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:34022) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gvfMG-0001mF-9M for bug-gnu-emacs@gnu.org; Mon, 18 Feb 2019 04:37:10 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gvfME-0002Hi-UA for bug-gnu-emacs@gnu.org; Mon, 18 Feb 2019 04:37:04 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:52816) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gvfME-0002HD-I1 for bug-gnu-emacs@gnu.org; Mon, 18 Feb 2019 04:37:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1gvfME-0002in-AM for bug-gnu-emacs@gnu.org; Mon, 18 Feb 2019 04:37:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: thunk2@arcor.de (Thomas Plass) Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 18 Feb 2019 09:37:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 34315 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 34315-submit@debbugs.gnu.org id=B34315.155048261110440 (code B ref 34315); Mon, 18 Feb 2019 09:37:02 +0000 Original-Received: (at 34315) by debbugs.gnu.org; 18 Feb 2019 09:36:51 +0000 Original-Received: from localhost ([127.0.0.1]:52097 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gvfM2-0002iK-TE for submit@debbugs.gnu.org; Mon, 18 Feb 2019 04:36:51 -0500 Original-Received: from vsmx009.vodafonemail.xion.oxcs.net ([153.92.174.87]:39134) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gvfM1-0002i5-1V for 34315@debbugs.gnu.org; Mon, 18 Feb 2019 04:36:50 -0500 Original-Received: from vsmx001.vodafonemail.xion.oxcs.net (unknown [192.168.75.191]) by mta-5-out.mta.xion.oxcs.net (Postfix) with ESMTP id 8EA16C0152; Mon, 18 Feb 2019 09:36:42 +0000 (UTC) Original-Received: from agame7.arcor.de (unknown [2.205.23.198]) by mta-5-out.mta.xion.oxcs.net (Postfix) with ESMTPA id E12D730008C; Mon, 18 Feb 2019 09:36:35 +0000 (UTC) In-Reply-To: Your message of Friday, February 15 2019 18:17:19 (ID: <87wom1otsw.fsf@panama>). X-VADE-STATUS: LEGIT X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:155490 Archived-At: --XqqZEn2pcU Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit [specific Emacs behaviour/bug question at end, list subscribers please read on] Ulf Jasper wrote at 18:17 on February 15, 2019: : the patch looks good so far. Could you please provide some testcases thanks. A set of iCalendar files is in the attached archive along with a README and a slightly cleaner version of the patch. However, for unit testing, you'd need to not only consider the data but the OS, too. What follows is not only meant as a reply to your request but is also a question for the Emacs maintainers. The date-time that prompted me to look at this in detail is Sat, Nov 3 2018 20:15 Europe/Berlin local time, the OS is Windows (7). I made tests with two pre-built binaries, the official GNU 26.1: (emacs-version) "GNU Emacs 26.1 (build 1, x86_64-w64-mingw32) of 2018-05-30" and an older "SourceForge" 25.3 build. I don't know what makes Sat, Nov 3 2018 (and the weekdays preceding it) so peculiar, but my hunch is its proximity to the DST transition that occured on the Sunday six days earlier, the "fifth week" of Oct. The decode/encode combo in the forms below is essentially the guts of icalendar--decode-isodatetime(), old and patched. The zone rule for Europe/Berlin is the current standard one, also computed by icalendar--convert-tz-offset(). The point of these examples is to see how time zone rules missing/supplied/in environment affect date-time conversions. Here's code for a same-zone scenario, note the two TZ setenv()s: (let ((Europe/Berlin "STD-01:00DST-02:00,M3.5.0/02:00:00,M10.5.0/03:00:00")) ;; force Windows behaviour, usually no TZ set (setenv "TZ") (print (decode-time (encode-time 0 15 20 3 11 2018 ))) (print (decode-time (encode-time 0 15 20 3 11 2018 Europe/Berlin) )) (print (decode-time (encode-time 0 15 20 3 11 2018 Europe/Berlin) Europe/Berlin)) ;; force Unixoid/POSIX? behaviour (setenv "TZ" Europe/Berlin) (print (decode-time (encode-time 0 15 20 3 11 2018 ))) (print (decode-time (encode-time 0 15 20 3 11 2018 Europe/Berlin) )) (print (decode-time (encode-time 0 15 20 3 11 2018 Europe/Berlin) Europe/Berlin)) nil) Official Windows-26.1 evals to (comments by me): (0 15 20 3 11 2018 6 nil 3600) ; correct, no-brainer (0 15 19 3 11 2018 6 nil 3600) ; wrong: 19:15?! (0 15 20 3 11 2018 6 t 7200) ; "less" wrong: DST is on?! (0 15 20 3 11 2018 6 t 7200) ; "less" wrong: DST is on?! (0 15 20 3 11 2018 6 t 7200) ; "less" wrong: DST is on?! (0 15 20 3 11 2018 6 t 7200) ; "less" wrong: DST is on?! SourceForge 25.3 performs slightly better: (0 15 20 3 11 2018 6 nil 3600) ; correct (0 15 19 3 11 2018 6 nil 3600) ; wrong: 19:15?! (0 15 20 3 11 2018 6 t 7200) ; "less" wrong: DST is on?! (0 15 20 3 11 2018 6 nil 3600) ; correct (0 15 20 3 11 2018 6 nil 3600) ; correct (0 15 20 3 11 2018 6 nil 3600) ; correct Never mind the DST weirdness, I can live with this behaviour as producing the desired 20:15 is possible in a predictable fashion. But it get's even weirder. Consider the following different-zone conversion. America/Creston is UTC-7, adding UTC+1 for Europe/Berlin makes an 8 hour difference. So, Berlin 20:15 is Creston 12:15, see also https://www.timeanddate.com/worldclock/converter.html?iso=20181103T191500&p1=37&p2=2274 Let's check: (let ((Europe/Berlin "STD-01:00DST-02:00,M3.5.0/02:00:00,M10.5.0/03:00:00") (America/Creston "STD+07:00")) ;; force Windows behaviour (setenv "TZ") (print (decode-time (encode-time 0 15 12 3 11 2018))) (print (decode-time (encode-time 0 15 12 3 11 2018 America/Creston))) (print (decode-time (encode-time 0 15 12 3 11 2018 America/Creston) Europe/Berlin)) ;; force Unixoid/POSIX? behaviour (setenv "TZ" Europe/Berlin) (print (decode-time (encode-time 0 15 12 3 11 2018))) (print (decode-time (encode-time 0 15 12 3 11 2018 America/Creston))) (print (decode-time (encode-time 0 15 12 3 11 2018 America/Creston) Europe/Berlin)) nil) Eval says (Official Windows-26.1): (0 15 12 3 11 2018 6 nil 3600) ; correct (no conversion possible) (0 15 20 3 11 2018 6 nil 3600) ; correct 20:15 with "their-zone" conversion only (0 15 21 3 11 2018 6 t 7200) ; wrong: 21:15 with "their zone" + "my zone" conversion (0 15 12 3 11 2018 6 nil 3600) ; correct (TZ in env applicable for decoding only) (0 15 21 3 11 2018 6 t 7200) ; wrong time 21:15 + wrong DST=on (0 15 21 3 11 2018 6 t 7200) ; wrong time 21:15 + wrong DST=on SourceForge 25.3 is slightly different: (0 15 12 3 11 2018 6 t 7200) (0 15 20 3 11 2018 6 nil 3600) (0 15 21 3 11 2018 6 t 7200) (0 15 12 3 11 2018 6 nil 3600) (0 15 21 3 11 2018 6 t 7200) (0 15 21 3 11 2018 6 t 7200) Things are fine again for dates following (Nov 4 etc.), ie. when October's "fifth week" comes to an end. If I remember correctly, Arch Linux pre-built 26.1 is always correct. So, getting the desired 20:15 is dependent on - what? Is it possible to drive decode-time/encode-time to always convert between time zones correctly and if so, how? Is this a bug in Emacs or am I just uninformed? Thomas --XqqZEn2pcU Content-Type: application/zip; name="icalendar019-patch+testcases.zip" Content-Disposition: attachment; filename="icalendar019-patch+testcases.zip" Content-Transfer-Encoding: base64 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 sKlPxPAG3+o1Rb1S1Oc7PV8Vmr7Ps9VS//FLv/JyA+kWm/1ynb3oJ7uQarHNlzstnYShm0z/15Y0 pelfZ+vQEmULHB6rS+FvUEsDBBQAAAAIAM9oUU7aDZvU9QAAAMABAAA6ABwARXVyb3BlX0Jlcmxp bi0yMDE4MTEwM1QyMDE1MDBfbm9faW4tY2FsZW5kYXJfVlRJTUVaT05FLmljc1VUCQADRU5pXI89 aVx1eAsAAQQgAgAABAECAwCl0U1rgzAYB/B7PkWOG5gusS3bcosaRsA3kmi7XSRUD4IvQ+v3X1LX Mtrjbg9/wu95ScA/RErLkMU8jZgEJZdKZCn1NxjkMotERHszLKYDR3SQSIuEf2Upp3yZxu/mJWim rh1AsCq85KkGYcyUonkRxCIEkbYu9TF5IwRvtS32GNtUaSb1Q17YdqtcrTK6e1ENY2XTk+maoTZT VV4H2rSneWWT3LHvmPivmuzwzrXjKpQi126x2pwb6FRECMJbD57b3gWU7D04jPCPDm+6B6/7AniZ Cz4VOkTkGZp5XvqmBqpIEiY//8s7HMBH3h3x97yX8vZfP1BLAwQUAAAACAC4oFFOLWu1jZcBAAAN BAAAUAAcAEFtZXJpY2FfQ3Jlc3Rvbi0yMDE4MTEwM1QxMjE1MDBfaW4tY2FsZW5kYXJfVlRJTUVa T05FX3R6dXJsX2hpc3RvcmljYWxfUkRBVEUuaWNzVVQJAAOLsGlcQ0ZpXHV4CwABBCACAAAEAQID AKWT306DMBTG7/sUfQAZPYgbq/Gig86Q8C+lLOoNwQ2VZGOGsQt9els2t8li1MhV+fqd/k75DhN+ 60d05rKARx4TaMZF6scRtQYEJSL2fI+uinpbLNFk55R+yB/iiCP5oPbYqmyqeWG6Tblp17USMxHQ l7Z9pabZvm+b5WDdPJvv67qs6qe12fffGYHvGkHsMqmp/e0dM5VM9+ap0+PpNOVyKuKQGmRkD4l9 EGWsJUKUELGQ0zCVyJOqVkgKjmMTICBJ9yDhMcnPVPUFjqwf0B3nBOwcwckpeAxDIGfgnvoHsNMH f3fjMThkSKwz8Bf1C1i/HOPdx81nPJLIDVia0iSbqLQ+Edd6AG56iVGLgANALiVYcKUInlTH/s6a Hecp33uMnievamNeLMt6UTT5ode8G7T8pVIlunqZd7cdVPPNrtkw0bAxAWskwSa27ounrvCTbuoW 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 c1VUBQADV7BpXHV4CwABBCACAAAEAQIDAFBLAQIeAxQAAAAIAKSgUU45F0TB2wIAACUKAABIABgA AAAAAAEAAAD4gQsEAABFdXJvcGVfQmVybGluLTIwMTgxMTAzVDIwMTUwMF9pbi1jYWxlbmRhcl9W VElNRVpPTkVfdHp1cmxfaGlzdG9yaWNhbC5pY3NVVAUAA2OwaVx1eAsAAQQgAgAABAECAwBQSwEC HgMUAAAACADPaFFO2g2b1PUAAADAAQAAOgAYAAAAAAABAAAA+IFoBwAARXVyb3BlX0Jlcmxpbi0y MDE4MTEwM1QyMDE1MDBfbm9faW4tY2FsZW5kYXJfVlRJTUVaT05FLmljc1VUBQADRU5pXHV4CwAB BCACAAAEAQIDAFBLAQIeAxQAAAAIALigUU4ta7WNlwEAAA0EAABQABgAAAAAAAEAAAD4gdEIAABB bWVyaWNhX0NyZXN0b24tMjAxODExMDNUMTIxNTAwX2luLWNhbGVuZGFyX1ZUSU1FWk9ORV90enVy bF9oaXN0b3JpY2FsX1JEQVRFLmljc1VUBQADi7BpXHV4CwABBCACAAAEAQIDAFBLAQIeAxQAAAAI ALSgUU7NmN5dZwEAABMDAABIABgAAAAAAAEAAAD4gfIKAABBbWVyaWNhX0NyZXN0b24tMjAxODEx MDNUMTIxNTAwX2luLWNhbGVuZGFyX1ZUSU1FWk9ORV90enVybF9zdGFuZGFyZC5pY3NVVAUAA4Ow aVx1eAsAAQQgAgAABAECAwBQSwECHgMUAAAACACxoE9OOa+3b3oHAABCFgAAEgAYAAAAAAABAAAA tIHbDAAAaWNhbGVuZGFyLmVsLnBhdGNoVVQFAAN+DWdcdXgLAAEE6AMDAAQBAgMAUEsFBgAAAAAH AAcAYgMAAKEUAAAAAA== --XqqZEn2pcU--