Анимация
JavaScript


Главная  Библионтека 

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

Переменная

Значение

Интервал

$sec

Секунды

0-60

$min

Минуты

0-59

Shours

Часы

0-23

Smday

День месяца

1-31

Smonth

Месяц

0-11,0== январь

$year

Год, начиная с 1900

1-138 (и более)

$wday

День недели

0-6,0 воскресенье

Syday

День года

1-366

$isdst

0 или 1

true, если действует летнее время

Секунды изменяются в интервале 0-60 с учетом возможных корректировок; под влиянием стандартов в любой момент может возникнуть лищняя секунда.

В дальнейшем совокупность «день/месяц/год/час/минута/секунда» будет обозначаться выражением «полное время» - хотя бы потому, что писать каждый раз «отдельные значения дня, месяца, года, часа, минут и секунд» довольно утомительно. Сокращение не связано с конкретным порядком возвращаемых значений.

Perl не возвращает данные о годе в виде числа из двух цифр. Он возвращает разность между текущим годом и 1900, которая до 1999 года представляет собой число из двух цифр. У Perl нет своей «проблемы 2000 года», если только вы не изобретете ее сами (впрочем, у вашего компьютера и Perl может возникнуть проблема 2038 года, если к тому времени еще будет использоваться 32-разрядная адресация). Для получения полного значения года прибавьте к его представлению 1900. Не пользуйтесь конструкцией 19$уеаг", или вскоре ваши программы начнут выдавать «год 19102». Мы не можем точно зафиксировать интервал года, потому что все зависит от размера целого числа, используемого вашей системой для представления секунд с начала эпохи. Малые числа дают небольшой интервал; большие (64-разрядные) числа означают огромные интервалы.

Скорее, менее В момент написания книги функция возвращала на 21 секунду меньше В соответствии со стандартом POSIX функция time не должна возвращать секунды, которые накапливаются из-за замедления вращения Земли, обусловлешюго воздействием приливов За дополнительной информацией обращайтесь к разделу 3 sci astro FAQ no адресу http astrosun tn Cornell edu/students/ lazio SCI astro 3 FAQ

прочитанная из списка строка даты/времени обычно преобразуется в количество секунд с начала эпохи, с ней производятся необходимые операции, после чего секунды снова преобразуются для вывода.

Для удобства вычислений количество секунд с начала эпохи всегда измеряется по Гринвичу. В любых преобразованиях всегда необходимо учитывать, представлено ли время по Гринвичу или в местном часовом поясе. Различные функции преобразования позволяют перейти от гринвичского времени в местное, и наоборот.

Функция Perl time возвращает количество секунд, прощедших с начала эпохи... более или менее точно. Для преобразования секунд с начала эпохи в конкретные дни, месяцы, годы, часы, минуты и секунды используются функции localtime и gmtime. В списковом контексте эти функции возвращают список, состоящий из девяти элементов.



В скалярном контексте localtime и gmtime возвращают дату и время, отформатированные в виде ASCII-строки:

Fri Apr 11 09:27:08 1997

Объекты стандартного модуля Time::tm позволяют обращаться к компонентам даты/времени по именам. Стандартные модули Time::locaItime и Time::gmtime переопределяют функции localtime и gmtime, возвращающие списки, и заменяют их версиями, возвращающими объекты Time::tm. Сравните два следующих фрагмента:

# Массив

print Today IS day , (localtime()[7], of the current year \n , Today is day 117 of the current year.

# Объекты Time tm $tm = localtime,

print Today IS day $tra->yday, of the current year \n , Today is day 117 of the current year.\

Чтобы преобразовать список в количество секунд с начала эпохи, воспользуйтесь стандартным модулем Time::Local. В нем имеются функции timelocal и timegm, которые получают список из девяти элементов и возвращают целое число. Элементы списка и интервалы допустимых значений совпадают с теми, которые возвращаются функциями localtime и gettime.

Количество секунд с начала эпохи ограничивается размером целого числа. Беззнаковое 32-разрядное целое позволяет представить время по Гринвичу от 20:45:52 13 декабря 1901 года до 03:14:07 19 января 2038 года включительно. Предполагается, что к 2038 году в компьютерах должны использоваться целые числа большей разрядности. Во всяком случае, будем надеяться на это. Чтобы работать с временем за пределами этого интервала, вам придется воспользоваться другим представлением или выполнять операции со отдельными значениями года, месяца и числа.

Модули Date::Calc и Date::Manip с CPAN работают с этими отдельными значениями, но учтите - они не всегда вычитают из года 1900, как это делает localtime, а нумерация месяцев и недель в них не всегда начинается с 0. Как всегда, в страницах руководства можно найти достоверные сведения о том, какая информация передается модулю, а какая - возвращается им. Только представьте, как будет неприятно, если рассчитанные вами финансовые показатели уйдут на 1900 лет в прошлое!

3.1. Определение текущей даты

Проблема

требуется определить год, месяц и число для текущей даты.

Решение

Воспользуйтесь функцией localtime. Без аргументов она возвращает текущую дату и время. Вы можете вызвать localtime и извлечь необходимую информацию из полученного списка:

($DAY, SMONTH, $YEAR) = (localtime)[3,4, 5],



3.1. Определение текущей даты 97

Модуль Timc::localtime переопределяет localtime так, чтобы функция возвращала объект Timcj.tm:

use Time localtime $tm = localtime,

($DAY, SMONTH, SYEAR) = (Stm->mday, $tm->mon, Stm->year),

Комментарий

Вывод текущей даты в формате ГГГГ-ММ-ДД с исиользоваиием стандартной функции localtime выполняется следующим образом:

(Sday, Smonth, Syear) = (localtime)[3,4 5],

printf( The current date is %04d %02d %02\n Syear+1900, $month+1, Sday), The current date is 1999 04 28

Нужные поля пз списка, возвраи1аемо10 localtime, извлекаются с но.мощью среза. Запись .могла выглядеть иначе;

(Sday, Smonth, Syear) = (localtime)[3 5],

A вот как тскунщя дата выводится в формате ГГГГ-ММ-ДД (рекомендованном стандаргом ISO 8601) с исиользованпем Time::Ioca]time:

use Time localtime $tm = localtime,

printf( The current date is %04d-%02d-%02\n , $tm->year+1900,

($tm->mon)+1, $tm->mday) The current date is 1999-04-28

В короткой програ.мме обьектпый интерфейс выглядит иеу.местио. Однако при большом обт:.е.ме вычислений с отдельными компопента.ми даты обращегигя по имени заметно упрощают чтение програ.ммы.

То же самое можно сделать и хитроумным способом, ие требуюпщм создания временных неременных:

printf( The current date is %04d-%02d-%02\n ,

sub {($ [5]+1900, $ [4]+1 $ [3])}->(localtime)).

Кроме того, в модуле POSIX имеется фушсция strftime, упоминаемая в рецепте 3.8:

use POSIX qw(strftime),

print strftime %Y-%m-%d\n , localtime,

Функция gmtime работает аналогично localtime, но возвращает время по Гринвичу, а не для местного часового пояса.

t> Смотри также-

Описание функци!! localtime и gmtime вperlfunc(iy, документация по стандарт-по.му модулю Time::localUme.



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