Perl скрипт с использованием Time :: Piece завершается без вывода, без ошибок - как отладить? - PullRequest
0 голосов
/ 19 апреля 2020

Я использую Perl 5.22 для Windows 10. У меня есть данные со строками времени / даты, которые выглядят как

12/31/09 08:40:00A

Данные даны по местному времени и не указывают, является ли Время в летнее время или нет, поэтому я пытаюсь это определить. Сначала я пытаюсь проанализировать строку для значения времени, чтобы я мог использовать

местное время (время);

до вернуть состояние DST в качестве 9-го значения .

Я пытаюсь разобрать строку времени / даты с помощью Time :: Piece:

  my $parsedtime = Time::Piece->strptime($timestampstr, '%m/%d/%y %I:%M:%S%p');

Когда эта строка не закомментирована, сценарий выходит из командной строки без каких-либо ошибок. или вывод. Даже вывод «Открытие имени файла» на консоль при самом запуске программы не появляется.

Если я закомментирую строку выше (и ссылки на $ parsedtime), остальная часть скрипта будет запущена, выведет файлы и выйдет нормально.

Что я могу сделать, чтобы отладить использование Time :: Piece?

1 Ответ

3 голосов
/ 20 апреля 2020

Чтобы построить местное время, вам нужно использовать

Time::Piece::localtime->strptime(...)

вместо

Time::Piece->strptime(...)

Итак,

use Time::Piece qw( localtime );

my $tp = localtime->strptime("$ARGV[0]M", "%m/%d/%y %I:%M:%S%p");
my $is_dst = ( localtime($tp->epoch) )[8];
say $is_dst ? 1 : 0;

Вывод:

$ ./a '6/31/09 08:40:00A'
1

$ ./a '12/31/09 08:40:00A'
0

Обратите внимание, что ваш формат отметок времени неоднозначен. В месте, где используется DST, есть один час в году, для которого он будет возвращать неверный результат.


О проблеме в комментариях,

use strict;
use warnings;
use feature qw( say );

use DateTime::Format::Strptime qw( );

my $format = DateTime::Format::Strptime->new(
   pattern   => '%m/%d/%y %I:%M:%S%p %Z',
   locale    => 'en',
   zone_map  => { CST => '-0600', CDT => '-0500' }, # Handle non-standard time zone names.
   time_zone => 'America/Chicago',                  # Optional. Convert result to this tz.
   strict    => 1,
   on_error  => 'croak',
);

while (<DATA>) {
   chomp;
   my $dt = $format->parse_datetime($_);
   my $epoch = $dt->epoch;
   my $local_dt_str = $dt->strftime("%Y-%m-%dT%H:%M:%S%z");
   $dt->set_time_zone('UTC');
   my $utc_dt_str = $dt->strftime("%Y-%m-%dT%H:%M:%SZ");
   say "$epoch $local_dt_str $utc_dt_str";
}

__DATA__
11/03/19 01:00:00AM CDT
11/03/19 01:59:58AM CDT
11/03/19 01:59:59AM CDT
11/03/19 01:00:00AM CST
11/03/19 01:00:01AM CST
11/03/19 01:59:59AM CST

Вывод:

1572760800 2019-11-03T01:00:00-0500 2019-11-03T06:00:00Z
1572764398 2019-11-03T01:59:58-0500 2019-11-03T06:59:58Z
1572764399 2019-11-03T01:59:59-0500 2019-11-03T06:59:59Z
1572764400 2019-11-03T01:00:00-0600 2019-11-03T07:00:00Z
1572764401 2019-11-03T01:00:01-0600 2019-11-03T07:00:01Z
1572767999 2019-11-03T01:59:59-0600 2019-11-03T07:59:59Z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...