Hi All,
I'm writing an application in Perl that processes a logfile with timestamps with differing timezones - One in UTC, and one in BST. For the uninitiated, BST, or British Summer Time is UTC, with Daylight savings time running from 1am on the last Sunday of March until 1am UTC/2am BST on the Last Sunday in October; So in 2008 this means BST runs from 01:00:00 AM 30th March through to 01:00:00 AM 26th October.
Test Program:
#!/usr/bin/perl
use POSIX;
use Time::Local;
print "Timezone: " . $ENV{TZ} . "\n\n";
&dateTimeToTimestamp("2008-03-30T00:59:59");
&dateTimeToTimestamp("2008-03-30T01:00:00");
&dateTimeToTimestamp("2008-03-30T01:00:01");
&dateTimeToTimestamp("2008-03-30T02:00:00");
&dateTimeToTimestamp("2008-10-26T00:59:59");
&dateTimeToTimestamp("2008-10-26T01:00:00");
&dateTimeToTimestamp("2008-10-26T01:00:01");
&dateTimeToTimestamp("2008-10-26T01:00:02");
&dateTimeToTimestamp("2008-10-26T01:30:00");
&dateTimeToTimestamp("2008-10-26T01:30:01");
&dateTimeToTimestamp("2008-10-26T01:30:01");
&dateTimeToTimestamp("2008-10-26T01:45:00");
&dateTimeToTimestamp("2008-10-26T01:50:00");
&dateTimeToTimestamp("2008-10-26T01:55:00");
&dateTimeToTimestamp("2008-10-26T01:55:59");
&dateTimeToTimestamp("2008-10-26T01:56:00");
&dateTimeToTimestamp("2008-10-26T01:57:00");
&dateTimeToTimestamp("2008-10-26T01:58:00");
&dateTimeToTimestamp("2008-10-26T01:59:58");
&dateTimeToTimestamp("2008-10-26T01:59:59");
&dateTimeToTimestamp("2008-10-26T02:00:00");
&dateTimeToTimestamp("2008-10-26T02:00:01");
&dateTimeToTimestamp("2008-10-26T02:59:59");
&dateTimeToTimestamp("2008-10-26T03:00:00");
&dateTimeToTimestamp("2008-10-26T03:00:01");
sub dateTimeToTimestamp {
print $_[0] . " ";
$_[0] =~ /(\d{4})-(\d{2})-(\d{2})([ |T])(\d{2}):(\d{2}):(\d{2}
+)/;
my($year, $mon, $day, $GMT, $hour, $min, $sec) = ($1, $2, $3,
+$4, $5, $6, $7);
print "UTC\t" . timegm($sec, $min, $hour, $day, $mon - 1, $yea
+r - 1900) . "\t";
print "BST\t" . mktime($sec, $min, $hour, $day, $mon - 1, $yea
+r - 1900, 0, 0) . "\n";
}
For which I get the output:
2008-03-30T00:59:59 UTC 1206838799 BST 1206838799
2008-03-30T01:00:00 UTC 1206838800 BST
2008-03-30T01:00:01 UTC 1206838801 BST
2008-03-30T02:00:00 UTC 1206842400 BST 1206838800
------------------------------------------------ << Added for clarity
2008-10-26T00:59:59 UTC 1224982799 BST 1224979199
2008-10-26T01:00:00 UTC 1224982800 BST 1224979200
2008-10-26T01:00:01 UTC 1224982801 BST 1224979201
2008-10-26T01:00:02 UTC 1224982802 BST 1224979202
2008-10-26T01:30:00 UTC 1224984600 BST 1224981000
2008-10-26T01:30:01 UTC 1224984601 BST 1224981001
2008-10-26T01:30:01 UTC 1224984601 BST 1224981001
2008-10-26T01:45:00 UTC 1224985500 BST 1224981900
2008-10-26T01:50:00 UTC 1224985800 BST 1224982200
2008-10-26T01:55:00 UTC 1224986100 BST 1224982500
2008-10-26T01:55:59 UTC 1224986159 BST 1224982559
2008-10-26T01:56:00 UTC 1224986160 BST 1224986160 <<<
+ BST Ends at 01:56:00??
2008-10-26T01:57:00 UTC 1224986220 BST 1224986220
2008-10-26T01:58:00 UTC 1224986280 BST 1224986280
2008-10-26T01:59:58 UTC 1224986398 BST 1224986398
2008-10-26T01:59:59 UTC 1224986399 BST 1224986399
2008-10-26T02:00:00 UTC 1224986400 BST 1224986400
2008-10-26T02:00:01 UTC 1224986401 BST 1224986401
2008-10-26T02:59:59 UTC 1224989999 BST 1224989999
2008-10-26T03:00:00 UTC 1224990000 BST 1224990000
2008-10-26T03:00:01 UTC 1224990001 BST 1224990001
So we can see that on the 30th of March, 1AM fails to exist in BST, as it gets shifted forwards an hour - All is good.
My confusion is what happens on the 26th of October, as the time seems to go back at 01:56:00am instead of 02:00:00am. I can see the output change as I change timezones in Windows, but am confused as to where this 4 minute disparity comes from.
Any assistance gratefully received - It's driving me mad!
Kind Regards,
Neil Saunders.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.