Функции работы с датами и временем
Формирование календаря на месяц
13.1.4. Считывание текущего времени: gettimeofday
array gettimeofday ()
Эта функция представляет собой обертку к системной функции UNIX gettime-ofday. Она возвращает ассоциативный массив, содержащий результаты обращения к этой функции.
Массив содержит следующие элементы:
sec | Секунды
| usec | Микросекунды
| minuteswest | Временная зона в минутах (на запад от Гринвича)
| dsttime | Тип коррекции
|
Надо отметить, что последний элемент никогда не использовался в ОС Linux и не
поддерживается ни libc-, ни glibc-библиотеками, поэтому не рассчитывайте получить из него какую-либо осмысленную информацию. Реально эта функция используется в основном для подсчета времени выполнения той или иной программы
или функции на РНР.
13.1.5. Форматирование в формат GMT/CUT:gmdate
string gmdate (string format [, int timestamp])
Функция в целом работает аналогично date() (см. раздел 13.1.2), но возвращаемое время автоматически приведено к формату Greenwich Mean Time (GMT). Это
позволяет добиться единого представления времени и даты при сведении воедино
информации из ранних временных поясов. Вот небольшой пример, иллюстрирующий эту возможность:
<НТМL>
<ТIТLЕ>Приведение к формату GMT</TITLE>
<BODY BGCOLOR="#FFFFFF">
<font size=+l>
<p> Местное время :
<? echo date ("M d Y H:i:s", mktime (0,0,0,1,1,2001)); ?>
<p> Время по Гринвичу;
<? echo gmdate ("M d Y H;i:s", mktime (0,0,0,1,1,2001));?>
Результат выполнения этой программы приведен на рис. 13.2. Как легко убедиться, различия временных зон могут затрагивать не только часы или дни, но порой
и годы!
Рис. 13.2. Приведение даты и времени к GMT-формату
См. также описания функция date() (раздел 13.1.2), mktime() (раздел 13.1.10)
и gmmktime() (раздел 13.1.6).
13.1.6. Формирование внутреннего представления: gmmktime
int gmmktime (int hour, int minute, int second, int month,
int day, int year [, int is_dst])
Функция полностью идентична mktime () (см. раздел 13.1.10), за исключением того,
что разбираемые аргументы интерпретируются как дата и время, приведенные
к GMT.
13.1.7. Форматирование GMT-даты: gmstrftime
string gmstrftime (string format [, int timestamp])
Функция работает точно так же, как и strftimeO (см. раздел 13.1.11) за исключением того, что все временные метки приводятся к Гринвичу (GMT):
<HTML>
<ТIТLЕ>Приведение к формату GMT</TITLE>
<BODY BGCOLOR="#FFFFFF">
<font size=+l>
<?
setlocale ('LC_TIME1, 'ru_RU.KOI8-R'); ?>
Локальное время:
<?
echo strftime ("%b %d %Y %H:%M:%S",
mktime (20,0,0,12,31,98));
?>
<p>
Время по Гринвичу: <?
echo gmstrftime ("%b %d %Y %H:%M:%S",
mktlrae (20,0,0,12,31,98));
?>
Результат выполнения этой программы приведен на рис. 13.3.
Подробно аргументы функции рассмотрены в разделе 13.1.11 при описании работы функции strftime().
Рис. 13.3. Функция gmstrftime правильно обрабатывает настройки локали
13.1.8. Считывание текущего времени: localtime
array localtime ([int timestamp [, bool is_associative]])
Функция localtime() возвращает массив, структура которого идентична результату применения одноименной функции из библиотеки Си. Все аргументы функции являются необязательными. Первый из них представляет собой дату, которая
должна быть конвертирована в структуру (по умолчанию преобразуется текущее
время). Если используется второй аргумент и его логическое значение равно true,
возвращаемый массив является ассоциативным. По умолчанию формируется обычный массив с числовой индексацией элементов.
В ассоциативном массиве элементы доступны по следующим ключам:
tm_sec | Секунды
| tm_min | Минуты
| tm_hour | Часы
| tm_mday | День месяца
| tm_mon | Месяц года
| tm_year | Номер года минус 1900
| tm_wday | День недели
| tm_yday | Номер дня в году
| tm_isdst | True, если включено декретное время
|
13.1.9. Микросекундный счетчик: microtime
string microtime ()
Возвращает строку вида «msec sec», где sec представляет собой значение текущего времени в секундах, начиная с начала эпохи UNIX (0:00:00,1 января, 1970 по
GMT), a msec представляет собой количество микросекунд. Естественно, что эта
функция работает только в операционных системах, поддерживающих системный
вызов gettimeofday ().
13.1.10. Дата во внутреннем формате: mktime
int mktime (int hour, int minute, int second,
int month, int day, int year [, int is_dst])
Функция возвращает метку времени в формате UNIX, соответствующую переданным ей аргументам. Эта метка представляет собой длинное целое число, которое
фактически содержит количество секунд, прошедших с начала эпохи UNIX (1 января 1970 г.) до указанного времени.
совет
Вниманию линуксоводов! Обратите внимание на порядок следования аргументов у этой
функции. Несмотря на то что это оболочка обычной системной функции mktime() библиотеки UNIX, аргументы в PHP-варианте расположены по-другому. Из-за этого опытные
(именно так!) программисты довольно часто допускают ошибки при работе с этой функцией в РНР.
примечание
Возможно, версия РНР для Windows отсчитывает время начиная с эпохи Майкрософт,
но поскольку Windows на моей машине нет с 1996 года [2], то проверить я это не смог...
Вы можете опустить любую часть аргументов в порядке справа налево. Те аргументы, которые вы не указали, автоматически принимают текущее значение для
локальной даты и времени. Собственно говоря, именно поэтому вызывает недоумение порядок следования аргументов, выбранный разработчиками. Гораздо более уместно было бы реализовать масштабируемый порядок, например: секунды,
минуты, часы, день, месяц, год. Ну да ладио, что сделано, то сделано.
Аргумент is_dst указывает на необходимость использования коррекции, связанной с использованием декретного времени. Если аргумент равен 1, считается, что декретное время включено, если 0 — выключено, а если этот аргумент равен -1
(используется по умолчанию), предполагается, что нам ничего не известно о наличии или отсутствии декретов для данного времени.
Функция mktime( ) часто используется для проведения арифметических вычислений над интервалами времени, автоматической проверки правильности ввода
дат, их переформатирования и т. д. Например, каждая из приведенных ниже строк
приведет к формированию одной и той же строки — Jan-01-1998:
echo date ("M-d-Y", mktime (0,0,0,12,32,1997));
echo date ("M-d-Y", mktime (0,0,0,13,1,1997));
echo date ("M-d-Y", mktime (0,0,0,1,1,1998));
echo date ("M-d-Y", mktime (0,0,0,1,1,98));
Функция позволяет также использовать несколько маленьких хитростей, которые отличают ее от прототипа из системной библиотеки UNIX. Так, вы можете записывать год только последними двумя цифрами. При этом значения
в диапазоне 0-69 соответствуют годам 2000-2069, а значения 70-99 — годам
1970-1999.
примечание
Сразу вспоминается хитроумный писарь из фильма «Формула любви», ради экономии
чернил записывающий в свидетельство о рождении только последнюю цифру года рождения.
Вторая хитрость заключается в том, что последний день любого месяца может быть
записан как «нулевой» (0) день следующего. Так, например, обе строки в приведенном ниже фрагменте выведут одно и тоже — «Последний день зимы 2000 года:
29 февраля»:
$lastday = mktime (0,0,0,3,0,2000);
echo strftime ("Последний день зимы 2000 года: %d %B", $lastday);
$lastday = mktime (0,0,0,4,-31,2000);
echo strftime ("Последний день зимы 2000 года: %d %B", $lastday);
Однако надо иметь в виду, что дата, в которой год, месяц и число равны нулю,
считается недопустимой. В противном случае это значение интерпретировалось
бы, в соответствии с изложенными выше правилами, как 30 ноября 1999 года, что,
согласитесь, весьма странно для значения по умолчанию.
|