2012-02-29 7 views
2

Я написал скрипт perl для получения даты и времени. Это действительно работает, но я задаюсь вопросом, есть ли более простой способ форматирования даты в качестве вывода.Простой способ форматирования даты

#!/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; 
+0

У вас есть объект DateTime в $ myTimeStamp. Объект DateTime имеет метод «strftime». Используйте его :) –

ответ

9

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 
+4

[также] (http://p3rl.org/DateTime#strftime-Patterns): '$ myTimeStamp-> strftime ('% Y% m% d% H')' – daxim

6

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

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

Пример:

use POSIX; 
print POSIX::strftime('%d-%m-%Y %H:%M:%S', localtime()); 
+3

Молитесь POSIX моим братьям и сестрам! Я бы предпочел, чтобы решение 'strftime' было« частью »Perl Core. – Ouki

+0

@ Ouki, это указывает на одну из проблем с предоставлением общих ответов Perl. В достаточно зрелой кодовой базе программист имеет всевозможные проводниковые идиомы - не обязательно на CPAN. Чтобы дать правдивый ответ о том, как я буду что-то делать, требуется всякий минимальный импорт моего инструментария идиомы программирования. Если я хочу стандартный формат для даты, это может быть отклонением, чтобы передать один и тот же формат при каждом вызове. Но когда дата преобразуется в строку, 'POSIX :: strftime' является тем, как дата становится строкой. – Axeman

1
  • Прежде всего всегда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/; 

ВЫВОД

--> 2012 02 28 12 
+0

Мне нужно извлечь поля даты позже для сборки путь. 'printf' может не работать. – conandor

1

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