about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-11-25 05:24:54 +0000
committerEric Wong <e@80x24.org>2019-11-27 01:49:52 +0000
commitd462440b512629fd8ef444ce105477fcab2ae6b1 (patch)
tree7261332caf37402648aa2b87b88c349f2d7a1a48
parent754647b28663aae0e07b7a5307bcf8ecf91b1795 (diff)
downloadpublic-inbox-d462440b512629fd8ef444ce105477fcab2ae6b1.tar.gz
I'm not sure if TZ minute offsets aside from '00' or '30' exist,
but lets just deal with them properly when negative.  Examples
taken from various inboxes on lore.kernel.org.  These are mostly
message from spammers, but some are legitimate messages.
-rw-r--r--lib/PublicInbox/MsgTime.pm4
-rw-r--r--t/msgtime.t5
2 files changed, 9 insertions, 0 deletions
diff --git a/lib/PublicInbox/MsgTime.pm b/lib/PublicInbox/MsgTime.pm
index 58e11d72..7dec48ce 100644
--- a/lib/PublicInbox/MsgTime.pm
+++ b/lib/PublicInbox/MsgTime.pm
@@ -23,6 +23,10 @@ sub str2date_zone ($) {
         my $sign = ($off < 0) ? '-' : '+';
         my $hour = abs(int($off / 3600));
         my $min  = ($off / 60) % 60;
+
+        # deal with weird offsets like '-0420' properly
+        $min = 60 - $min if ($min && $off < 0);
+
         my $zone = sprintf('%s%02d%02d', $sign, $hour, $min);
 
         # "-1200" is the furthest westermost zone offset,
diff --git a/t/msgtime.t b/t/msgtime.t
index f969fa25..cecbb921 100644
--- a/t/msgtime.t
+++ b/t/msgtime.t
@@ -92,4 +92,9 @@ is_datestamp('Tue, 3 Jun 2003 8:58:23 --500', [1054648703, '-0500']);
 is_datestamp('Thu, 18 May 100 10:40:43 +0200 (MET DST)', [958639243, '+0200']);
 is_datestamp('Thu, 18 May 2000 10:40:43 +0200', [958639243, '+0200']);
 is_datestamp('Tue, 27 Feb 2007 16:23:25 -0060', [1172597005, '-0100']);
+is_datestamp('Wed, 20 Dec 2006 05:32:58 -0420', [1166608378, '-0420']);
+is_datestamp('Wed, 20 Dec 2006 05:32:58 +0420', [1166577178, '+0420']);
+is_datestamp('Thu, 14 Dec 2006 00:20:24 +0480', [1166036424, '+0520']);
+is_datestamp('Thu, 14 Dec 2006 00:20:24 -0480', [1166074824, '-0520']);
+is_datestamp('Mon, 14 Apr 2014 07:59:01 -0007', [1397462761, '-0007']);
 done_testing();