#!perl use DateTime; use DateTime::TimeZone; use strict; my %seen=(); my $tz = 'UTC'; my $last; while (){ chomp; next unless ($_); my ($y,$m,$d,$hr,$min) = split /\D/,$_; print "$_ : "; my $dt = DateTime->new ( year => $y, month => $m, day => $d, hour => $hr, minute => $min, time_zone => 'Europe/London', ); print $dt->is_dst," : "; if ($m==10 && $hr==1){ if ($dt->is_dst() ne $last){ $tz = '-1:00'; } $tz = 'UTC' if ++$seen{$min} > 1; } else { %seen=(); } $last = $dt->is_dst(); $dt->set_time_zone($tz); print $dt->strftime("%Y-%m-%d %H:%M")," $tz \n"; } __DATA__ 2014-03-30 00:59 2014-03-30 02:00 2014-03-30 02:01 2014-03-30 02:30 2014-03-30 02:59 2014-03-30 03:00 2014-03-30 03:01 2014-03-30 03:30 2014-03-30 03:59 2014-03-30 04:00 2014-03-30 04:01 2014-03-30 04:02 2014-10-26 00:59 2014-10-26 01:00 2014-10-26 01:01 2014-10-26 01:30 2014-10-26 01:59 2014-10-26 01:00 2014-10-26 01:01 2014-10-26 01:30 2014-10-26 01:59 2014-10-26 02:00 2014-10-26 02:01 2014-10-26 02:02