Анимация
JavaScript
|
Главная Библионтека 3.2. Преобразование полного времени в секунды с начала эпохи Проблема Требуется преобразовать дату/время, выраженные отдельными значениями дня, месяца, юда и т. д. в количество секунд с начала эпохи. Решение Воспользуйтесь функцией timelocal или timegm стандаргпого модуля Тпне;:Ьоса1. Выбор зависит от того, относится ли дата/время к текущему часовому поясу или Гринвичскому меридиану: use Time Local, $TIME = timelocal($sec, $min, $hours $mday, $nion, $year) $TIME = timegm($sec, $min, $hours $mday, $mon $year), Комментарий Встросшпш функция localtime преобразует количество секунд с начала эпохи в компоненты полного времени; процедура timelocal из стаидаргного модуля Tnne::LocaI преобразует компоненты полного времени в секунды. Следующий пример показывает, как определяется количество секунд с начала эпохи для текущей даты. Значения дня, месяца и года получаются от localtime; # $hours, $minutes и $seconds задают время для текущей даты # и текущего часового пояса use Time Local $time = timelocal($seconds, $minutes, $hours, (localtime)[3 4,5]) Если функции timelocal передаются месяц и год, они должны нрипадлежать тем же интервалам, что п значения, возвращаемые localtime. А именно, нумерация месяцев начинаеюя с О, а из года вычитается 1900. Фу]н<цня timelocal предполагает, что компоиепты полного времени соответствуют текущему часовому поясу. Модуль Тпт1е::Ьоса1 также экспортирует процедуру timegm, для которой компоненты полного времени задаются для Гринвичского меридиана. К сожалению, удобных средств для работы с другими часовыми поясами, кроме текущего или Гринвичского, не существует. Лучшее, чго мож]10 сде-лат ь, - преобразовать время к Гринвичскому и вычесть или прибавить смещение часового пояса в секундах. В следующем фрагменте демонег]»1руется как применение timegm, так и настройка 1и1тервалов года и месяца; # $day - день месяца (1-31) # $month - месяц (1-12) « $уеаг - год, состоящий из четырех цифр (например, 1999) # Shours, $minutes и $seconds - компоненты времени по Гринвичу use Time Local, $time = timegm($seconds, $minutes $hours, $day, $month-1, $year-1900) 3.3. Преобразование секунд с начала эпохи в полное время 99 Как было показано во введении, количество секунд с начала эпохи ис может выходить за пределы интервала от 20-.45:52 13 декабря 1901 года до 03:14:07 19 января 2038 года включительно. Не прсобра;(уйте такие даты - либо воспользуйтесь модулем Date:: с CPAN, либо выполняйте вычисления вручную. t> Смотри также- Документация но стандартному модулю Time::Local. Обратное преобразование рассматривается в рецепте 3.3. 3.3. Преобразование секунд с начала эпохи в полное время Проблема Требуется преобразоват ь количество секунд с начала эпохи в отдельные зпачегшя дня, месяца, года и т. д Решение Воспользуйтесь фупкцисн localtime или gmtime в зависимости от того, хотите ли вы получить дагу/вре.мя /[ля текущего часового пояса или для Гринвичского меридиана. ($seconds $minutes, Shours $day of month Syear Swday, Syday $isdst) = localtiiiie($TIME) Стандартные модули Tnne-.timelocal и Тицс: gnitime нереонределяют функции localtime и gmtime так, чтобы к компонептам можно было обращаться по именам: use Time localtime, # или Time gmtime $tm = localtime($TIME), # или gmtime($TIME) Sseconds = $tm->sec, # Комментарий Функции localtime и gettime возвращают несколько странную шгформацню о годе и месяце; из года вычитается 1900, а нумерация месяцев начинается с О (январь). Не забудьте исправить полученные величины, как это делается в следующем примере: (Sseconds, Sminutes Shours, $day of month, Smonth, Syear, Swday, Syday, Sisdst) = localtime($time), printf( Dateline %02d %02d %02d-%04d/%02d/%02d\n , Shours, Sminutes, Sseconds, $year+1900, $month+1, $day of month), Модуль Time::localtime позволяет избавиться от временных перемеииых: use Time localtime, $tni = localtime($time) printf( Dateline %02d %02d %02d-%04d/%02d/%02d\n , $tm->hour, $tm->niin, $tm->sec, $tni->year+1900, $tm->mon+1, $tm->mday), l> Смотри также- Описание функц1И1 localtime пperlfunc(l); документация no стандартным модулям Time;:localtime и Tmie/gmtime, Обратное преобразование рассматривается в рецепте 3.2. 3.4. Операции сложения и вычитания для дат Проблема Имеется значение даты/временн. Требуется определить дату/время, отделе1Н1ую от них некоторым промежутком в прошлом или будущем. Решение Проблема решается простым сложением или вычитанием секунд с пачгша эпохи: $when = $now + $difference, $then = $now - Sdifference, Если у вас и.меются отдельные компоненты полного времени, воспользу)!-тесь модулем Dale::Calc с CPAN. Если вычисления выполняются только с целыми днями, нримеиите функцию Add Delta Oays (смещение Soffset может представлять собой как положительное, так и отрицательное целое количество диен): use Date Calc qw(Add Delta Days), ($у2, $iii2, $d2) = Add Delta Days($y, $m, $d, $offset) Если в вычислениях используются часы, лншуты и секунды (то есть не только дата, но и время), воспользу11тесь ([jynKnneii Add Delta DHMS: use Date DateCalc qw(Add Oelta DHMS), ($year2, $month2, $day2, $h2, $m2, $s2) = Add Oelta DHMS( $year, $nionth, $day, $hour $minute, $seconds, $days offset, $hour offset, $minute offset, $seconds offset ), Комментарий Вычисления с секупдалт от начала эпохи выполняются проще всего (если не считать усили11 на преобразования даты/временн в секунды и обратно). В следующем фрагменте показано, как прпбав1ггь смещеппе (в данном примере - 55 дней, 2 часа, 17 минут и 5 секунд) к заданно!! базовоГг дате и времени: $birthtime = 96176750, # 18 января 1973 года, 03 45 50 $interval = 5 + #5 секунд 17 . 60 + #17 минут 2 - 60 60 + #2 часа 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [ 27 ] 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |