Perl's Date :: Manip - как конвертировать данную дату в другой часовой пояс - PullRequest
1 голос
/ 03 марта 2011

Рассмотрим следующий фрагмент кода, который принимает пользовательский ввод (дату) и форматирует его, используя UnixDate from Date :: Manip

#!/usr/bin/perl
use Date::Manip;

my $input = join(" ", @ARGV);
my $date = UnixDate($input, "%Y-%m-%d %T"); 
print $date;

Это было сделано, чтобы позволить пользователям вводить дружественные даты, такие как " вчера " или " 1 неделя назад ".

Я хотел бы использовать $ date с другим часовым поясом (он будет использоваться для извлечения данных SQL). Как это будет сделано? Я не нашел никакой конструкции UnixDate , которая позволила бы поставить часовой пояс, и я не знаю, как переформатировать ввод пользователя (объединение имени часового пояса с ним не помогает).

Пример

Пользователь находится где-то в Центральной Европе (часовой пояс: CET) и вводит «сегодня в 13:00». Выполнение кода выше выглядит следующим образом:

$ ./test.pl today at 1pm
2011-03-03 13:00:00

Это ожидаемый результат, поскольку изменения часового пояса не действуют. Я хотел бы использовать эту $ date с другим часовым поясом, например, Pacific Standard (часовой пояс: PST). В этом случае вывод должен быть:

$ ./test.pl today at 1pm
2011-03-03 04:00:00

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

Попробуйте функцию Date_ConvTZ():

 my $date = UnixDate( Date_ConvTZ( $input, 'CET', 'PST' ), "%Y-%m-%d %T");

Из руководства от Дата :: Manip :: DM6

0 голосов
/ 03 марта 2011

Я не знаю, как заставить Date::Manip понимать часовые пояса, но это было бы довольно просто с DateTime:

my $input = join(" ", @ARGV);
my $date  = UnixDate($input, "%Y-%m-%d %T");
$date =~ /(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/;
my $dt = DateTime->new(
    year      => $1,
    month     => $2,
    day       => $3,
    hour      => $4,
    minute    => $5,
    second    => $6,
    time_zone => 'CET',
);
$dt->set_time_zone('America/Vancouver'); # My DateTime::TimeZone doesn't have PST

Вы можете заменить Date::Manip использование одним или несколькими модулями DateTime , DateTime - это стандартная библиотека манипулирования датами для Perl, поэтому она используется для всех ваших дат и времени. потребности имеют смысл; OTOH, используйте то, что работает для вас, и, вероятно, нет никакого вреда в использовании Date::Manip и DateTime, если это выполнит работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...