Perl форматирует дату и время UTC MySQL в строку GMT / BST Лондон / Европа - PullRequest
0 голосов
/ 06 февраля 2019

DateTime отформатирован как 2019-01-01 01:02:03, возвращенный из базы данных MySQL.Я хотел бы преобразовать это в Europe/London и выводить в формате:

2019-01-01 01:02:03 GMT (UTC +00:00)

Это также должно быть в состоянии обрабатывать BST DateTimes, такие как:

2019-07-01 01:02:03 UTC выдаст 2019-07-01 02:02:03 BST (UTC +01:00)

Я пытался посмотреть на этот вопрос и ответ , но не могу понять, как применить это преобразование локали к предоставленной строке DateTime, а не now?

Это псевдокод, эквивалентный тому, что мне нужно, прости мой ужасный Perl ...

use DateTime;
my $my_utc_date_time = "2019-01-01 01:02:03";

# this needs to use $my_utc_date_time not now
my $start_date = DateTime->now->set_time_zone("Europe/London")->iso8601;

my $start_date_formatted = strftime("%Y-%m-%d %H:%M:%S %Z (UTC +00:00)", $start_date);

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Есть несколько вариантов, например формат )

use strict;
use warnings;

use Date::Language;

my $dt = Date::Language->new('English');
print $dt->time2str("%Y-%m-%d %H:%M:%S %Z (UTC %z)", time, 'Europe/London');

Результат

2019-02-06 14:08:05 EUROPE/LONDON (UTC +0000)
0 голосов
/ 06 февраля 2019

Просто для полноты я добавляю ответ для Date :: Manip тоже:

#!/usr/bin/perl
use strict;
use warnings;

use Date::Manip;

my $date = Date::Manip::Date->new()
    or die "can't create Date::Manip::Date object\n";

# Parse time
my $error;
# add timezone - otherwise parser assumes local timezone
$error = $date->parse("${ARGV[0]} UTC")
    and die "PARSE: ${error}\n";

foreach my $zone (
    'UTC',
    'Europe/Helsinki',
    'Europe/London',
    'America/New_York',
    'America/Los_Angeles',
    'Asia/Tokyo',
) {
    # Convert time to other timezone
    $error = $date->convert($zone)
        and die "CONVERT (${zone}) ${error}\n";
    printf "%-25s: %s\n", $zone, $date->printf('%Y-%m-%d %H:%M:%S %Z (UTC %z)');
}

exit 0;

Вывод:

$ perl dummy.pl "2019-01-01 01:02:03"
UTC                      : 2019-01-01 01:02:03 UTC (UTC +0000)
Europe/Helsinki          : 2019-01-01 03:02:03 EET (UTC +0200)
Europe/London            : 2019-01-01 01:02:03 GMT (UTC +0000)
America/New_York         : 2018-12-31 20:02:03 EST (UTC -0500)
America/Los_Angeles      : 2018-12-31 17:02:03 PST (UTC -0800)
Asia/Tokyo               : 2019-01-01 10:02:03 JST (UTC +0900)

# example in summer to show "BST"
$ perl dummy.pl "2018-06-01 01:02:03"
UTC                      : 2018-06-01 01:02:03 UTC (UTC +0000)
Europe/Helsinki          : 2018-06-01 04:02:03 EEST (UTC +0300)
Europe/London            : 2018-06-01 02:02:03 BST (UTC +0100)
America/New_York         : 2018-05-31 21:02:03 EDT (UTC -0400)
America/Los_Angeles      : 2018-05-31 18:02:03 PDT (UTC -0700)
Asia/Tokyo               : 2018-06-01 10:02:03 JST (UTC +0900)
0 голосов
/ 06 февраля 2019
use strict;
use warnings;

use DateTime;
use DateTime::Format::Strptime;

my $my_utc_date_time = "2019-07-01 01:02:03";

my $datetime_parser = DateTime::Format::Strptime->new(pattern => '%F %T',
                                                      locale => 'en_GB',
                                                      time_zone => 'UTC');

my $datetime = $datetime_parser->parse_datetime($my_utc_date_time);
print $datetime->strftime('%FT%T %Z (UTC %z)'), "\n";

my $local_datetime = $datetime->set_time_zone('Europe/London');
print $local_datetime->strftime('%FT%T %Z (UTC %z)'), "\n";

Выход:

2019-07-01T01:02:03 UTC (UTC +0000)
2019-07-01T02:02:03 BST (UTC +0100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...