Как я могу напечатать дату и время в формате xs: dateTime на Perl? - PullRequest
3 голосов
/ 05 февраля 2010

Я хотел бы взять отметку времени (например, 1263531246) и преобразовать ее в строковое представление, подходящее для вывода в файл XML в поле атрибута, соответствующем xs:dateTime. xs:dateTime ожидает что-то вроде:

2002-05-30T09:30:10-06:00

В идеале я бы использовал форму вывода, которая включает смещение от UTC (как указано выше). В этом проекте я вынужден использовать Perl. Есть предложения?

Ответы [ 2 ]

7 голосов
/ 05 февраля 2010

Используя правильный DateTime модуль форматирования, вы можете переводить между отформатированные строки и объекты DateTime без написания болезненных регулярных выражений для анализа или использования strftime() для форматирования.

Похоже, вам нужен формат XSD (подмножество ISO8601, используемое в схемах XML): см. DateTime :: Format :: XSD .

use DateTime;
use DateTime::Format::XSD;

my $dt = DateTime->now;
print DateTime::Format::XSD->format_datetime($dt);

производит:

2010-02-04T23:24:11+00:00

Если вы обрабатываете много объектов DateTime, вы можете сократить код, полагаясь на автоматическое форматирование и строковое форматирование; просто передайте аргумент 'formatter' вашему конструктору DateTime:

my $dt = DateTime->new(year => 1999, month => 1, day => 1,
                       formatter => 'DateTime::Format::XSD'
                      );

my $xml = "<date>$dt</date>";   # through the magic of overloading, this works!

Результат:

<date>1999-01-01T00:00:00+00:00</date>

Для получения дополнительной информации см. http://search.cpan.org/dist/DateTime/lib/DateTime.pm#Formatters_And_Stringification.

5 голосов
/ 05 февраля 2010

Это работает в Linux:

$ perl -MPOSIX -e 'print POSIX::strftime("%Y-%m-%dT%H:%M:%S%z\n", localtime)'
2010-02-04T17:37:43-0500

В Windows с ActiveState Perl выводится:

2010-02-04T17:39:24Eastern Standard Time

Использование DateTime :

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

use DateTime;
my $dt = DateTime->now(time_zone => 'EST');
print $dt->strftime('%Y-%m-%dT%H:%M:%S%z'), "\n"

Я получаю правильную строку и в Windows:

E:\> t
2010-02-04T18:06:24-0500

Я считаю Дата :: Формат гораздо более легкий вес модуля:

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

use Date::Format;
print time2str('%Y-%m-%dT%H:%M:%S%z', time, 'EST'), "\n";

Выход:

E:\> t
2010-02-04T18:11:36-0500
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...