PHP-4 Эффективная работа


Функции работы с датами и временем
Формирование календаря на месяц

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_isdstTrue, если включено декретное время












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 года, что, согласитесь, весьма странно для значения по умолчанию.

назад
далее

Сайт управляется системой uCoz