В 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');