Perl имеет удобную встроенную функцию для поиска текущей даты и времени в ваших скриптах. Однако когда мы говорим о поиске времени, мы говорим о времени, которое в настоящее время установлено на компьютере, на котором выполняется скрипт. Например, если вы запускаете свой Perl-скрипт на локальном компьютере, localtime вернет текущее время, которое вы установили, и предположительно установлено в текущий часовой пояс.
Когда вы запускаете тот же сценарий на веб-сервере, вы можете обнаружить, что локальное время отключено по сравнению с местным временем в вашей настольной системе. Возможно, сервер находится в другом часовом поясе или установлен неправильно. У каждой машины может быть совершенно другое представление о том, что такое местное время, и может потребоваться некоторая корректировка, либо внутри скрипта, либо на самом сервере, чтобы привести его в соответствие с тем, что вы ожидаете.
Функция localtime возвращает список, полный данных о текущем времени, некоторые из которых необходимо будет скорректировать. Запустите программу ниже, и вы увидите, что каждый элемент в списке напечатан в строке и разделен пробелами.
#! / USR / местные / бен / Perl
@timeData = местное время (время);
print join ('', @timeData);
Вы должны увидеть что-то похожее на это, хотя число может сильно отличаться.
20 36 8 27 11 105 2 360 0
Эти элементы текущего времени расположены по порядку:
- Секунды после минуты
- Минуты после часа
- Часы за полночь
- День месяца
- Месяцы после начала года
- Количество лет с 1900
- Количество дней с начала недели (воскресенье)
- Количество дней с начала года
- Так или иначе дневного сбережения активен
Поэтому, если мы вернемся к примеру и попытаемся его прочитать, вы увидите, что 27 декабря 2005 г. в 8:36:20, это 2 дня после воскресенья (вторника) и 360 дней с начала год. Летнее время не активно.
Делаем Perl локально читаемым
Несколько элементов в массиве, которые возвращает localtime, немного неудобно читать. Кто бы мог подумать о текущем году с точки зрения количества лет после 1900 года? Давайте рассмотрим пример, который делает нашу дату и время более понятными.
#! / USR / местные / бен / Perl
@months = qw (январь фев мар апр апр май июнь июль авг сент окт окт ноя дек);
@weekDays = qw (вс пн вт ср чт пт сб вс);
($ second, $ minute, $ hour, $ dayOfMonth, $ month, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = localtime ();
$ year = 1900 + $ yearOffset;
$ theTime = "$ час: $ минута: $ секунда, $ weekDays [$ dayOfWeek] $ месяцы [$ месяц] $ dayOfMonth, $ год";
выведите $ theTime;
Когда вы запустите программу, вы должны увидеть гораздо более удобочитаемые дату и время, например:
9:14:42, среда, 28 декабря 2005 г.
Итак, что мы сделали, чтобы создать эту более читаемую версию? Сначала мы подготовим два массива с названиями месяцев и дней недели.
@months = qw (январь фев мар апр апр май июнь июль авг сент окт окт ноя дек);
@weekDays = qw (вс пн вт ср чт пт сб вс);
Так как функция localtime возвращает эти элементы в значениях в диапазоне от 0-11 до 0-6 соответственно, они являются идеальными кандидатами в массив. Значение, возвращаемое localtime, может использоваться как числовой адрес для доступа к правильному элементу в массиве.
$ months [$ month] $ weekDays [$ dayOfWeek]
Следующий шаг - получить все значения из функции localtime. В этом примере мы используем ярлык Perl для автоматического размещения каждого элемента в массиве localtime в его собственную переменную. Мы выбрали имена, чтобы было легко запомнить, какой элемент какой.
($ second, $ minute, $ hour, $ dayOfMonth, $ month, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = localtime ();
Нам также необходимо скорректировать значение года. Помните, что localtime возвращает количество лет с 1900 года, поэтому, чтобы найти текущий год, нам нужно добавить 1900 к полученному нами значению.
$ year = 1900 + $ yearOffset;
Как узнать текущее время GM в Perl
Допустим, вы хотите избежать всех возможных путаниц в часовых поясах и взять под контроль смещение. Получение текущего времени по местному времени всегда будет возвращать значение, основанное на настройках часового пояса компьютера - сервер в США вернутся один раз, в то время как сервер в Австралии вернет один почти полный день, отличный от часового пояса. различия.
В Perl есть вторая удобная функция определения времени, которая работает точно так же, как и местное время, но вместо того, чтобы возвращать время, установленное для вашей машины. часовой пояс, это возвращает Всемирное координированное время (сокращенно как UTC, также называемое временем по Гринвичу или по Гринвичу). Достаточно просто функция вызывается gmtime.
#! / USR / местные / бен / Perl
@timeData = gmtime (время);
print join ('', @timeData);
Кроме того, что возвращаемое время будет одинаковым на всех машинах и в GMT, между функциями gmtime и localtime нет никакой разницы. Все данные и преобразования выполняются одинаково.
#! / USR / местные / бен / Perl
@months = qw (январь фев мар апр апр май июнь июль авг сент окт окт ноя дек);
@weekDays = qw (вс пн вт ср чт пт сб вс);
($ second, $ minute, $ hour, $ dayOfMonth, $ month, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = gmtime ();
$ year = 1900 + $ yearOffset;
$ theGMTime = "$ час: $ минута: $ секунда, $ weekDays [$ dayOfWeek] $ месяцы [$ месяц] $ dayOfMonth, $ год";
выведите $ theGMTime;
- localtime вернет текущее местное время на машине, на которой выполняется скрипт.
- gmtime вернет универсальное среднее время по Гринвичу или GMT (или UTC).
- Возвращаемые значения могут быть не совсем такими, как вы ожидаете, поэтому обязательно конвертируйте их по мере необходимости.