Простой способ форматировать дату - PullRequest
2 голосов
/ 29 февраля 2012

Я написал Perl-скрипт для получения datetime.Это работает, но мне интересно, есть ли более простой способ форматировать дату как вывод.

#!/usr/bin/perl
use DateTime;

my $dt          = DateTime->now( time_zone => 'local' );
$myTimeStamp    = $dt->subtract( days => 1 );
$myYear         = $myTimeStamp->year;
$myMonth        = $myTimeStamp->month;
if ( length( $myMonth ) == 1 ) {
    $myMonth = "0$myMonth";
}
$myDay          = $myTimeStamp->day;
if ( length( $myDay ) == 1 ) {
    $myDay = "0$myDay";
}
$myHour         = $myTimeStamp->hour;
if ( length( $myHour ) == 1 ) {
    $myHour = "0$myHour";
}
#$myDir          = "/var/tmp/logs/$myYear/$myMonth/$myYear$myMonth-";

print "--> $myYear $myMonth $myDay $myHour\n";
# --> 2012 02 28 02
exit 0;

Ответы [ 4 ]

9 голосов
/ 29 февраля 2012

DateTime предоставляет метод format_cldr для этого:

use DateTime;

my $myTimeStamp = DateTime->now->subtract( days => 1 );

printf "--> %s\n", $myTimeStamp->format_cldr('yyyy MM dd HH');
# --> 2012 02 28 02
7 голосов
/ 29 февраля 2012

Конечно, используйте POSIX модуль:

Модуль POSIX позволяет вам получить доступ ко всем (или почти ко всем) стандартные идентификаторы POSIX 1003.1.

Пример:

use POSIX;
print POSIX::strftime('%d-%m-%Y %H:%M:%S', localtime());
1 голос
/ 29 февраля 2012

Для переформатирования дат, как отмечалось, есть основной модуль POSIX . Было бы упущением не смотреть и на основной модуль Time :: Piece , который не только обеспечивает strftime(), но и strptime() для обеспечения очень гибкого анализа даты / времени. Time::Piece появилось в ядре Perl в 5.9.5.

1 голос
/ 29 февраля 2012
  • Прежде всего всегда use strict; и use warnings; в начале вашей программы и объявите все ваши переменные близко к их первому использованию. Это особенно относится к тем случаям, когда вы обращаетесь за помощью, поскольку обнаруживает множество простых ошибок, которые не сразу очевидны.

Лучше всего использовать printf, если вы хотите обнулить любой вывод. Также нет необходимости извлекать поля даты для разделения переменных. Является ли результат, который вы показали, тот, который вы в конечном итоге хотите? Эта программа делает то же самое, что и код, который вы опубликовали.

use strict;
use warnings;

use DateTime;

my $myTimeStamp = DateTime->now->subtract( days => 1 );
printf "--> %04d %02d %02d %02d\n", map $myTimeStamp->$_, qw/year month day hour/;

OUTPUT

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