Re: [perl #19393] Bug in Time::localtime?
Dave Mitchell [Wed, 1 Jan 2003 21:43:24 +0000 (21:43 +0000)]
Message-ID: <20030101214324.F12907@fdgroup.com>
(integrated from change #18397 in maint-5.8)
p4raw-link: @18397 on //depot/maint-5.8/perl: 7bc6bea4535085425366718a732073dd9f13e3fc

p4raw-id: //depot/perl@18497
p4raw-integrated: from //depot/maint-5.8/perl@18496 'copy in'
lib/Time/Local.pm lib/Time/Local.t (@17645..)

lib/Time/Local.pm
lib/Time/Local.t

index faef1d7..51553b5 100644 (file)
@@ -132,7 +132,18 @@ sub timelocal {
        or return $loc_t;
 
     # Adjust for DST change
-    $loc_t + $dst_off;
+    $loc_t += $dst_off;
+
+    # for a negative offset from GMT, and if the original date
+    # was a non-extent gap in a forward DST jump, we should
+    # now have the wrong answer - undo the DST adjust;
+
+    return $loc_t if $zone_off <= 0;
+
+    my ($s,$m,$h) = localtime($loc_t);
+    $loc_t -= $dst_off if $s != $_[0] || $m != $_[1] || $h != $_[2];
+
+    $loc_t;
 }
 
 
index a384b17..68952c9 100755 (executable)
@@ -28,7 +28,7 @@ use Time::Local;
 # use vmsish 'time' makes for oddness around the Unix epoch
 if ($^O eq 'VMS') { $time[0][2]++ }
 
-print "1..", @time * 2 + 5, "\n";
+print "1..", @time * 2 + 6, "\n";
 
 $count = 1;
 for (@time) {
@@ -93,6 +93,20 @@ timegm(0,0,0, 1, 2, 80) - timegm(0,0,0, 1, 0, 80) == 60 * 24 * 3600
   or print "not ";
 print "ok ", $count++, "\n";
 
+# bugid #19393
+# At a DST transition, the clock skips forward, eg from 01:59:59 to
+# 03:00:00. In this case, 02:00:00 is an invalid time, and should be
+# treated like 03:00:00 rather than 01:00:00 - negative zone offsets used
+# to do the latter
+
+{
+    my $hour = (localtime(timelocal(0, 0, 2, 7, 3, 102)))[2];
+    # testers in US/Pacific should get 3,
+    # other testers should get 2
+    print "not " unless $hour == 2 || $hour == 3;
+    print "ok ", $main::count++, "\n";
+}
+
 
 #print "Testing timelocal.pl module too...\n";
 package test;