| | 486 | # Convert yyyymmddhhmmss +hhmm format to calendar time. |
| | 487 | # Use $zone to override with true timezone name. eg. ':localtime', ':Australia/Sydney', ':UTC'. |
| | 488 | # Use $default_zone to set a zone when none if found in $xmltv. Defaults to localtime. |
| | 489 | # Returns $time in UTC and $z is its zone. |
| | 490 | # eg. my @timez = xmltvtimez("200706021800 +1100", ":Australia/Sydney"); |
| | 491 | sub xmltvtimez { |
| | 492 | my ($xmltv, $zone, $default_zone) = @_; |
| | 493 | |
| | 494 | my ($Y, $M, $D, $h, $m, $s, $z) = |
| | 495 | $xmltv =~ /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})? ?([+-]\d{4})?/ or |
| | 496 | die "Can't interprete xmltvtime \"$xmltv\"."; |
| | 497 | |
| | 498 | $z = $zone || ( $z ? "aus$z" : $default_zone ); |
| | 499 | |
| | 500 | local %ENV; |
| | 501 | if (defined $z and $z !~ "local") { $ENV{TZ} = $z; POSIX::tzset(); } |
| | 502 | my $time = POSIX::mktime($s?$s:0,$m,$h,$D,$M-1,$Y-1900,0,0,0) or |
| | 503 | die "Can't mktime from xmltvtime \"$xmltv\"."; |
| | 504 | if (defined $z and $z !~ "local") { local %ENV; POSIX::tzset(); } |
| | 505 | |
| | 506 | return ($time, $z); |
| | 507 | } |
| | 508 | |
| | 509 | # Move to a different timezone. |
| | 510 | #$timez[1] = ":localtime"; # Move to local time |
| | 511 | #$timez[1] = ":Australia/Sydney"; # Move to Australia/Sydney time |
| | 512 | #$timez[1] = ":UTC"; # Move to utc time |
| | 513 | #$timez[1] = "utc+0000"; # Move to utc time |
| | 514 | |
| | 515 | # Convert calendar time to yyyymmddhhmmss +hhmm format. |
| | 516 | # $time is in UTC and $z is its zone. Changing $z moves to a new timezone. |
| | 517 | # eg. print timezxmltv(@timez); |
| | 518 | # eg. print timezxmltv($time); # Defaults to localtime. |
| | 519 | sub timezxmltv { |
| | 520 | my ($time, $z) = @_; |
| | 521 | |
| | 522 | local %ENV; |
| | 523 | if (defined $z and $z !~ "local") { $ENV{TZ} = $z; POSIX::tzset(); } |
| | 524 | my $xmltv = POSIX::strftime("%Y%m%d%H%M%S %z", localtime($time)); |
| | 525 | if (defined $z and $z !~ "local") { local %ENV; POSIX::tzset(); } |
| | 526 | |
| | 527 | return $xmltv; |
| | 528 | } |
| | 529 | |
| | 530 | # Show it all works ok. |
| | 531 | sub testxmltvtimez { |
| | 532 | print POSIX::strftime("%Y%m%d%H%M%S %z\t\t\tStart time\n\n", localtime()); |
| | 533 | |
| | 534 | my $str = "200706022000"; |
| | 535 | my @timez = xmltvtimez($str); |
| | 536 | print timezxmltv(@timez) . " " . ($timez[1] || "") . "\t\t\tOriginal time\n"; |
| | 537 | @timez = xmltvtimez("$str", ":UTC"); |
| | 538 | print timezxmltv(@timez) . " " . ($timez[1] || "") . "\t\tOverride with utc\n"; |
| | 539 | @timez = xmltvtimez("$str", ":Australia/Sydney"); |
| | 540 | print timezxmltv(@timez) . " " . ($timez[1] || "") . "\tOverride with Australia/Sydney\n\n"; |
| | 541 | |
| | 542 | @timez = xmltvtimez($str); |
| | 543 | print timezxmltv(@timez) . " " . ($timez[1] || "") . "\t\t\tOriginal time\n"; |
| | 544 | $timez[1] = ":UTC"; |
| | 545 | print timezxmltv(@timez) . " " . ($timez[1] || "") . "\t\tMove to utc time\n"; |
| | 546 | $timez[1] = ":localtime"; |
| | 547 | print timezxmltv(@timez) . " " . ($timez[1] || "") . "\t\tMove to local time\n"; |
| | 548 | $timez[1] = "utc+0000"; |
| | 549 | print timezxmltv(@timez) . " " . ($timez[1] || "") . "\t\tMove to utc time\n"; |
| | 550 | $timez[1] = ":Australia/Sydney"; |
| | 551 | print timezxmltv(@timez) . " " . ($timez[1] || "") . "\tMove to Australia/Sydney\n"; |
| | 552 | |
| | 553 | print POSIX::strftime("\n%Y%m%d%H%M%S %z\t\t\tEnd time.\n", localtime()); |
| | 554 | } |
| | 555 | |
| | 556 | ########################################################################## |
| | 557 | |