Perl - Как конвертировать дату? - PullRequest
4 голосов
/ 07 июля 2011

Как преобразовать формат даты ГГГГ-ММ-ДДЧЧ: ММ: ССЗ в ГГГГ-ММ-ДД ЧЧ: ММ + 8 часов?

Например:

Input: 2011-07-07T18:05:45Z

Output: 2011-07-08 02:05

Ответы [ 5 ]

6 голосов
/ 08 июля 2011

Давайте начнем с фрагмента Рахула и добавим в него дату и форматирование выходных данных ...

use DateTime; 
use DateTime::Format::ISO8601;

use DateTime::Format::Strptime;

my $string = '2011-07-07T18:05:45Z';
my $dt = DateTime::Format::ISO8601->parse_datetime( $string ); 
die "Impossible time" unless $dt;

my $formatter = new DateTime::Format::Strptime(pattern => '%Y-%m-%d %T');
$dt->add( hours => 8 )->set_formatter($formatter);
print "$dt\n";

Я добавил использование DateTime :: Format :: Strptime, чтобы указать желаемый формат вывода.

Затем я добавил еще три строки:

  1. Сначала я создаю форматтер и передаю ему желаемый шаблон вывода.
  2. Затем я добавляю восемь часов к исходной дате и назначаю вывод отформатировать, связав вызов set_formatter () с вызовом add ().
  3. Тогда я печатаю это.
2 голосов
/ 07 июля 2011

Используете ли вы модули DateTime ?

В частности, вот ссылка на DateTime :: Format :: ISO8601 , которая читает / записывает формат ISO 8601, который вы указали в качестве ввода.

1 голос
/ 08 июля 2011

Если у вас нет DateTime, у вас наверняка есть Time :: Piece:

use strict;
use warnings;

use Time::Piece;
use Time::Seconds qw(ONE_HOUR);

my $str = '2011-07-07T18:05:45Z';
my $t = Time::Piece->strptime($str, "%Y-%m-%dT%TZ");
$t += 8 * ONE_HOUR;
print $t->strftime("%Y-%m-%d %H:%M"),"\n";
0 голосов
/ 08 июля 2011

Не работает, результат 2010-02-28T15: 21: 33

Тогда сделай это нелегко ...

use Time::Local
use warnings;
use strict;

$time = '2010-02-28T15:21:33Z';

my ($year, month, day) = split (/-/, $time)
$year -= 1900;   #Year is an offset of 1900
$month -= 1;     #Months are 0 - 11

#Now split the time off of the day (DDTHH:MM:SS)

$day = substr($day, 0, 2);
time = substr($day, 3)

#Now split the time

(my $hour, $minute, $second) = split(/:/, $time);

$second =~ s/Z$//;  #Remove Z

my $time_converted = timelocal($second, $minute, $hour, $day, $month, $year);

#Now you have the time, Add eight hours

my $hours_in_seconds = 8 * 60 * 60;
$time_converted += $hours_in_seconds;

# Almost done: Convert time back into the correct array:

($second, $minute, $hour, $day, $month, $year) = localtime($time_converted);

$year += 1900;
$month += 1;

# Now, reformat:

my $formatted_time = sprint (%04d-%02d-%02d %02d:%02d), 
    $year, $month, $day, $hour, $minute;
0 голосов
/ 07 июля 2011

взято с

Как проверить дату / время в формате UTC в формате Uyyy-MM-dd'T'HH: mm: ssZ в UTC с помощью Perl?

use DateTime; 
use DateTime::Format::ISO8601;
my $string = '2010-02-28T15:21:33Z';
my $dt = DateTime::Format::ISO8601->parse_datetime( $string ); die "Impossible time" unless $dt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...