PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 101
Решение
Воспользуйтесь функцией timelocal пли timegm стандартного модуля Time::Local. Выбор зависит от того, относится ли дата/время к текущему часовому поясу пли Гринвичскому меридиану:
use Time Local,
$TIME = timelocal($sec, $mm, $hours Smday, Smon, $year)
$TIME = timegm($sec, $min, $hours $mday, $mon $year),
Комментарий
Встроенная функция localtime преобразует количество секунд с начала эпохи в компоненты полного времени; процедура timelocal из стандартного модуля Time::Local преобразует компоненты полного времени в секунды. Следующий пример показывает, как определяется количество секунд с начала эпохи для текущей даты. Значения дня, месяца и года получаются от localtime:
# $hours, Sminutes и Sseconds задают время для текущей даты
# и текущего часового пояса
use Time Local
$time = timelocal($seconds, Sminutes, $hours, (localtime)[3 4,5])
Если функции timelocal передаются месяц и год, они должны принадлежать тем же интервалам, что и значения, возвращаемые localtime. А именно, нумерация месяцев начинав!ся с 0, а из года вычитается 1900.
Функция timelocal предполагает, что компоненты полного времени соответствуют текущему часовому поясу. Модуль Time::Local также экспортирует процедуру timegm, для которой компоненты полного времени задаются для Гринвичского меридиана. К сожалению, удобных средств для работы с другими часовыми поясами, кроме текущего или Гринвичского, не существует. Лучшее, что можно сделать, — преобразовать время к Гринвичскому и вычесть или прибавить смещение часового пояса в секундах.
В следующем фрагменте демонстрируется как применение timegm, так и настройка интервалов года и месяца:
# $day - день месяца (1-31)
# $month - месяц (1-12)
8 $уеаг - год, состоящий из четырех цифр (например, 1999)
# $hours, Sminutes и Sseconds - компоненты времени по Гринвичу
use Time Local,
$time = timegm($seconds, Sminutes $hours, Sday, $month-1, Syear-1900)
3.3. Преобразование секунд с начала эпохи в полное время 99