2013-05-27 6 views
0

Я ищу не-так долгий путь, чтобы произвести следующие действия в Perl:Время в Perl в следующем формате: 20130527

Часть кода, который получает текущее время (месяц, день и год). Например, если мы в 2013 году, 27 мая, выход должен быть 20130527

я теперь, что если мы используем «МестноеВремя», как

$date_str = localtime; 

Выход находится в формате: ср Июль 18 07:24:05 2001 Есть ли другая специальная переменная, которая может быть полезна?

ответ

5

В Perl, время хранится как число секунд с Эпоха. Эпоха обычно 1 января 1970 года.

Это хорошо подходит для сортировки и расчета будущих дней. Если вам нужно знать, каким будет день через 30 дней, вы можете добавить к нему 2,592,000 (количество секунд в 30 дней).

Perl имеет стандартную функцию, называемую time, которая возвращает количество секунд с момента Эпохи. Затем вы можете использовать localtime или gmtime, чтобы перевести это в массив элементов времени (день, год, часы и т. Д.).

Perl, по какой-то странной причине, никогда не имел внутренней функции, чтобы взять массив элементов времени и преобразовать его обратно в число секунд с момента Эпохи. Однако у Perl всегда был стандартный модуль, который делал это с функциями timelocal и timegm. В Pre-5.0 Perl дней вы бы require "timelocal.pl";. В Perl 5.0 теперь вы находитесь use Time::Local;.

время преобразования взад и вперед между массивами временных элементов и секунд с момента The Epoch может быть немного боли с localtime, gmtime, timelocal и timegm функций, и в Perl 5.10, два новых модуля Time::Piece и Time::Seconds. Эти два модуля позволяют отформатировать время с помощью функций strptime и strftime, встроенных в Time::Piece.

Если у вас есть Perl 5.10.0 или выше, у вас есть это легко:

use Time::Piece; 

my $time = localtime; #$time is a Time::Piece object 

# $time_string is in YYYYMMDD format 
my $time_string = sprintf "%04d%02d%02d%", $time->year, $time->month, $time->day; 

# Another way to do the above using the strftime function: 
my $time_string = $time->strftime("%Y%m%d"); 

Однако ваша программа должна использовать количество секунд, прошедших с The Epoch как внутреннее время внутри вашей программы. Вы должны сохранить время в этом формате. Вы должны рассчитать время в этом формате, и вы должны передать время в этом формате для всех функций.

Это связано с тем, что другие модули Perl ожидают время в этом формате, и, что более важно, другие разработчики Perl, которые будут смотреть и поддерживать ваш код, ожидают времени в этом формате.

#Converting the time from YYYYMMDD to seconds since the epoch 
my $time = Time::Piece->strptime($YYYYDDMM_time, '%Y%m%d'); 
my $time_since_epoch = $time->epoch; 

#Converting time since the epoch to YYYYMMDD 
my $time = localtime($time_since_epoch); 
my $YYYYMMDD_time = $time->strftime('%Y%m%d'); 
7

Вы можете использовать strftime из стандартного POSIX модуля:

use POSIX 'strftime'; 
say strftime "%Y%m%d", localtime; 

Выход:

20130526 
4

Или используйте LocalTime в контексте списка:

($d,$m,$y) = (localtime)[3,4,5]; 
say sprintf("%4d%02d%02d", $y+1900, $m+1, $d); 
1

Вы можете сделать это, как показано ниже ..

use POSIX; 
my $today = POSIX::strftime('%Y%m%d', localtime); 
print "$today\n"; 

Output: 20130527