Php занятие 6. функции даты и времени

mktime


mktime — получает временную метку UNIX для даты

Описание

(int hour, int minute, int second, int month, int day, int year);

Предупреждение:

Обратите внимание на необычный порядок аргументов, который отличается от порядка аргументов в вызове функции mktime() из UNIX, и который нехорошо ведет себя при неправильно заданных параметрах (см.ниже). Это очень часто встречающаяся ошибка в скриптах.

Возвращает временную метку Unix согласно данным аргументам. Эта временная метка является целым числом, равным количеству секунд между эпохой Unix (1 Января 1970) и указанным временем.

Аргументы могут быть опущены с права налево; каждый опущенный таким образом аргумент будет установлен в текущую величину согласно локальной дате и времени.

MkTime is useful for doing date arithmetic and validation, as it MkTime полезена при арифметических дейтсвиях с датой и ее проверкой, она будет автоматически вычислять корректную величину для вешедших за границы параметров. Например, каждая из следующих строк возвращает строку «Jan-01-1998».

Пример 1. Пример mktime()

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) );

См.также и .

What is epoch time?

The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap seconds (in ISO 8601: 1970-01-01T00:00:00Z). Literally speaking the epoch is Unix time 0 (midnight 1/1/1970), but ‘epoch’ is often used as a synonym for Unix time. Some systems store epoch dates as a signed 32-bit integer, which might cause problems on January 19, 2038 (known as the Year 2038 problem or Y2038). The converter on this page converts timestamps in seconds (10-digit), milliseconds (13-digit) and microseconds (16-digit) to readable dates.

Human-readable time  Seconds
1 hour 3600 seconds
1 day 86400 seconds
1 week 604800 seconds
1 month (30.44 days)  2629743 seconds
1 year (365.24 days)   31556926 seconds

Описание

strftime

Возвращает строку, отформатированную в соответствии с аргументом

format, используя аргумент

timestamp или текущее системное время, если

этот аргумент не передан. Названия месяцев, дней недели и другие

строки, зависящие от языка, соответствуют текущей локали,

установленной функцией setlocale().

В форматирующей строке распознаются следующие символы:

%a — сокращенное название дня недели в текущей локали

%A — полное название дня недели в текущей локали

%b — сокращенное название месяца недели в текущей локали

%B — полное название месяца недели в текущей локали

%c — предпочтительный формат даты и времени в текущей локали

%C — столетие (год, деленный на 100 и огругленный до целого, от 00 до 99)

%d — день месяца в виде десятичного числа (от 01 до 31)

%D — аналогично %m/%d/%y

%e — день месяца в виде десятичного числа, если это одна цифра, то

перед ней добавляется пробел (от ‘ 1′ до ’31’)

%g — подобно %G, но без столетия.

%G — Год, 4-значное число, соответствующее номеру недели по ISO (см. %V).

Аналогично %Y, за исключением того, что если номер недели по ISO

соответствует предыдущему или следующему году, используется

соответствующий год.

%h — аналогично %b

%H — номер часа от 00 до 23

%I — номер часа от 01 до 12

%j — номер дня в году (от 001 до 366)

%m — номер месяца (от 01 до 12)

%M — минуты

%n — символ «\n»

%p — `am’ или `pm’, или соответствующие строки в текущей локали

%r — время в формате a.m

или p.m.

%R — время в 24-часовом формате

%S — секунды

%t — символ табуляции («\t»)

%T — текущее время, аналогично %H:%M:%S

%u — номер дня недели от 1 до 7, где 1 соответствует понедельнику

Внимание

На Sun Solaris 1 соответствует воскресенью, хотя в ISO 9889:1999

(текущий стандарт языка C) явно указано, что это должен быть

понедельник.

%U — порядковый номер недели в текущем году. Первым днем первой

недели в году считается первое воскресенье года.

%V — Порядковый номер недели в году по стандарту ISO 8601:1988

от 01 до 53, где 1 соответствует первой неделе в году, в которой

как минимум 4 дня принадлежат этому году

Первым днем недели считается понедельник.

(Используйте %G or %g для определения соответствующего года)

%W — порядковый номер недели в текущем году. Первым днем первой

недели в году считается первый понедельник года.

%w — номер дня недели, 0 соответствует воскресенью

%x — предпочтительный формат даты без времени в текущей локали

%X — предпочтительный формат времени без даты в текущей локали

%y — год без столетия (от 00 до 99)

%Y — год, включая столетие

%Z — временная зона в виде смещения, аббривеатуры или полного

наименования

%% — символ `%’

Пример 1. Пример использования функции strftime() с разными локалями

Пример 2. Пример номеров недели по ISO 8601:1988

См. также описание функций setlocale(),

mktime(), и спецификацию strftime() Open Group.

LICENSE

The MIT License

Copyright (c) 2012-2017 Yoshio HANAWA

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.


THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

4 ответа

8 Лучший ответ

Способ работы большинства веб-серверов (например, Apache) — поддерживать коллекцию рабочих потоков. Когда выполняется PHP script, один поток запускает PHP скрипт.

Когда ваш script выполняет , script выполняется 100 секунд. Это означает, что ваш рабочий поток привязан на 100 секунд.

Проблема в том, что у вас очень ограниченное число рабочих потоков — скажем, у вас 10 потоков и 10 пользователей — теперь ваш веб-сервер не может обслуживать дальнейшие ответы.

Лучший способ ограничить скорость входа в систему (или другие действия) — использовать какую-то быструю память в памяти (memcached отлично подходит для этого), но для этого требуется отдельный процесс и довольно сложный (вы можете сделать это, если вы запустите что-то вроде Facebook..).

Проще говоря, у вас может быть таблица базы данных, в которой хранятся или , и .

Каждый раз, когда вы получаете неудачный логин, вы (в псевдокоде) будете делать:

Может быть, не самый эффективный, и есть лучшие способы, но он должен прекратить грубое форсирование довольно хорошо. Использование memcached в основном то же самое, но база данных заменяется memcached (что быстрее)

01 фев. 2009, в 07:30 Поделиться 3

Я бы сначала спросил, что вы действительно пытаетесь предотвратить? Если это атаки типа «отказ в обслуживании», то я должен сказать, что вы ничего не можете сделать, если вы ограничены тем, что можете добавить в сценарии PHP. Уровень техники намного выше того, от чего мы, программисты, можем защитить. Начните смотреть на инструменты sysadmin, предназначенные для этой цели.

Или вы пытаетесь ограничить свой сервис, чтобы реальные люди могли получить к нему доступ, а боты — нет? Если это так, я бы посмотрел на некоторые «капчи» методы.

Или вы пытаетесь запретить пользователям опрашивать ваш сайт каждую секунду в поисках нового контента? Если это так, я бы расследовал предоставление RSS-канала или какой-либо другой способ уведомить их, чтобы они не поглощали вашу пропускную способность.

Или что-то еще?

В общем, я бы сказал, что sleep() и usleep() не являются хорошим способом.

01 фев. 2009, в 06:47 Поделиться 1

Вы не хотите спать в своем php. Это значительно уменьшит количество одновременных запросов, которые может обслуживать ваша служба, поскольку вы будете иметь ожидающие подключения.

На большинстве HTTP-серверов есть функции, которые вы можете включить, чтобы избежать DoS-атак, но при этом вам не следует просто отслеживать IP-адреса, которые вы видели слишком много раз слишком недавно, и отправить им 403 Forbidden с сообщением с просьбой подождать секунду.

Если по какой-то причине вы не можете рассчитывать на то, что REMOTE_ADDR зависит от пользователя (все за тем же брандмауэром и т.д.), вы можете доказать сложность в форме входа в систему и сделать удаленный браузер для этого расширенным расчетом (скажем, коэффициент числа), который вы можете быстро проверить на стороне сервера (с быстрым умножением).

01 фев. 2009, в 07:31 Поделиться 1

Ваш предложенный метод заставит ВСЕ пользователей ожидать ненужных действий перед входом в систему.

Большинство серверов LAMP (и большинство маршрутизаторов/коммутаторов, фактически) уже настроены для предотвращения атак типа «отказ в обслуживании». Они делают это, отклоняя несколько последовательных запросов с одного и того же IP-адреса.

01 фев. 2009, в 05:57 Поделиться

Ещё вопросы

  • 1969Как вы анализируете и обрабатываете HTML / XML в PHP?
  • 930Получить полный URL в PHP
  • 641Что такое потокобезопасный или не потокобезопасный в PHP?
  • 542Создать папку, если она еще не существует
  • 498Как получить полезные сообщения об ошибках в PHP?
  • 430Сортировать массив объектов по полям объекта
  • 359Как выбрать библиотеку аутентификации для CodeIgniter?
  • 351Лучшие практики для пользовательских помощников в Laravel 5
  • 311Лучший способ сделать несколько конструкторов в PHP
  • 284Есть ли песочница PHP, что-то вроде JSFiddle для JS?

USAGE

<?php
var_dump(date("Y-m-d")); // todays date
timecop_freeze();
var_dump(gmdate("Y-m-d H:i:s")); // string(19) "1970-01-01 00:00:00"
var_dump(strtotime("+100000 sec")); // int(100000)

The difference between and

is used to statically mock the concept of now. As your program executes, will not change unless you make subsequent calls to . , on the other hand, computes an offset between what we currently think is and the time passed in. It uses this offset to simulate the passage of time. To demonstrate, consider the following code snippets:

<?php
$new_time = mktime(12, , , 9, 1, 2008);
timecop_freeze($new_time);
sleep(10);
var_dump($new_time == time()); // bool(true)

timecop_return(); // "turn off" php-timecop

timecop_travel($new_time);
sleep(10);
var_dump($new_time == time()); // bool(false)

How to get the current epoch time in …

PHP More PHP
Python Source
Ruby (or ). To display the epoch:
Perl More Perl
Java Returns epoch in seconds.
C# (.NET Framework 4.6+/.NET Core), older versions:
Objective-C (returns double) or
C++11
Lua
VBScript/ASP
AutoIT
Delphi Tested in Delphi 2010.
R
Erlang/OTP (version 18+), older versions:
MySQL More MySQL examples
PostgreSQL
SQLite
Oracle PL/SQL
SQL Server
IBM Informix
JavaScript The getTime method returns the time in milliseconds.
Visual FoxPro Warning: time zones not handled correctly
Go
Adobe ColdFusion
Tcl/Tk
Unix/Linux Shell
Solaris Solaris doesn’t support date +%s, but the default seed value for nawk’s random-number generator is the number of seconds since the epoch.
PowerShell
Other OS’s Command line: (If Perl is installed on your system)

strftime

strftime — форматирует локальное время согласно установкам locale

Описание

(string format, int timestamp);

Возвращает строку, отформатированную согласно данной форматной строке и используя данную временную метку или текущее локальное время, если метка не задана. Названия месяцев и недель и другие, зависящие от языка строки, зависят от текущего locale, устанавливающегося с помощью .

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

  • %a — сокращенное название дня недели согласно текущему locale

  • %A — полное название дня недели согласно текущему locale

  • %b — сокращенное название месяца согласно текущему locale

  • %B — полное название месяца согласно текущему locale

  • %c — предпочтительное представление даты и времени для текущего locale

  • %d — день месяца как десятичное число (в диапазоне от 0 до 31)

  • %H — час как десятичное число в 24-часовом формате (в диапазоне от 00 до 23)

  • %I — час как десятичное число в 12-часовом формате (в диапазоне от 01 до 12)

  • %j — день года как десятичное число (в диапазоне от 001 до 366)

  • %m — месяц как десятичное число (в диапазоне от 1 до 12)

  • %M — минуты как десятичное число

  • %p — `am’ или `pm’ согласно текущему времени, или соответствующие строки для текущего locale

  • %S — секунды как десятичное число

  • %U — номер недели текущего года как десятичное число, начиная с первого Воскресенья в качестве первого дня первой недели

  • %W — номер недели текущего года как десятичное число, ночиная с первого Понедельника в качестве первого дня первой недели

  • %w — день недели как целое число, Воскресенье — 0-й день

  • %x — предпочитаемое представление даты для текущего locale не включающее время

  • %X — предпочитаемое представление времени для текущего locale не включающее дату

  • %y — год как десятичное число без столетия (в диапазоне от 00 до 99)

  • %Y — год как десятичное число, включая столетие

  • %Z — временная зона или название или сокращение

  • %% — символ `%’

Пример 1. Пример функции strftime()

setlocale ("LC_TIME", "C");
print(strftime("%A in Finnish is "));
setlocale ("LC_TIME", "fi");
print(strftime("%A, in French "));
setlocale ("LC_TIME", "fr");
print(strftime("%A and in German "));
setlocale ("LC_TIME", "de");
print(strftime("%A.\n"));

Пример будет работать, если у вас установлены соответствующие locale.

См.также и .

Описание

date

Возвращает время, отформатированное в соответствии с аргументом

format, используя метку времени, заданную

аргументом timestamp или текущее системное

время, если timestamp не задан.

Другими словами, timestamp является

необязательным и по умолчанию равен значению, возвращаемому функцией

time().

Таблица 1. В параметре format распознаются следующие символы

Символ в строке format Описание Пример возвращаемого значения
a Ante meridiem или Post meridiem в нижнем регистре am или pm
A Ante meridiem или Post meridiem в верхнем регистре AM или PM
B Время в стадарте Swatch Internet От 000 до 999
c Дата в формате ISO 8601 (добавлено в PHP 5) 2004-02-12T15:19:21+00:00
d День месяца, 2 цифры с ведущими нулями от 01 до 31
D Сокращенное наименование дня недели, 3 символа от Mon до Sun
F Полное наименование месяца, например January или March от January до December
g Часы в 12-часовом формате без ведущих нулей От 1 до 12
G Часы в 24-часовом формате без ведущих нулей От до 23
h Часы в 12-часовом формате с ведущими нулями От 01 до 12
H Часы в 24-часовом формате с ведущими нулями От 00 до 23
i Минуты с ведущими нулями 00 to 59
I (заглавная i) Признак летнего времени 1, если дата соответствует летнему времени, иначе otherwise.
j День месяца без ведущих нулей От 1 до 31
l (строчная ‘L’) Полное наименование дня недели От Sunday до Saturday
L Признак високосного года 1, если год високосный, иначе .
m Порядковый номер месяца с ведущими нулями От 01 до 12
M Сокращенное наименование месяца, 3 символа От Jan до Dec
n Порядковый номер месяца без ведущих нулей От 1 до 12
O Разница с временем по Гринвичу в часах Например: +0200
r Дата в формате RFC 2822 Например: Thu, 21 Dec 2000 16:01:07 +0200
s Секунды с ведущими нулями От 00 до 59
S Английский суффикс порядкового числительного дня месяца, 2 символа

st, nd, rd или


th. Применяется совместно с j

t Количество дней в месяце От 28 до 31
T Временная зона на сервере Примеры: EST, MDT
U

Количество секунд, прошедших с начала Эпохи Unix (The Unix

Epoch, 1 января 1970, 00:00:00 GMT)

См. также time()
w Порядковый номер дня недели От (воскресенье) до 6 (суббота)
W Порядковый номер недели года по ISO-8601, первый день недели — понедельник (добавлено в PHP 4.1.0) Например: 42 (42-я неделя года)
Y Порядковый номер года, 4 цифры Примеры: 1999, 2003
y Номер года, 2 цифры Примеры: 99, 03
z Порядковый номер дня в году (нумерация с 0) От до 365
Z

Смещение временной зоны в секундах. Для временных зон

западнее UTC это отрицательное число, восточнее UTC — положительное.

От -43200 до 43200

Любые другие символы, встреченные в строке format,

будут выведены в результирующую строку без изменений.

Z всегда возвращает при

использовании gmdate().

Пример 1. Примеры использования функции date()

Избежать распознавания символа как форматирующего можно, если экранировать

этот символ с помощью \ Если в сочетании с

\ символ являееся специальным (например,

\t), следует добавлять еще один

\.

Пример 2. Экранирование символов в функции date()

Функции date() и

mktime() для вывода прошедших и будущих дат.

Пример 3. date() и mktime() example

Приведем еще несколько примеров использования функции

date(). Помните, что следует экранировать все

символы, которые вы хотите видеть в результате работы функции без

изменений. Это относится и к символам, которые в текущей версии PHP

не распознаются как специальные, так как этим символам может быть

назначено значение в следующих версиях.

Используйте одинарные кавычки для предотвращения преобразования

\n в перевод строки.

Пример 4. Форматирование с использованием date()

Для форматирования дат на других языках используйте функции

setlocale() и strftime().

См. также описание функций getlastmod(), gmdate(),

mktime(), strftime()

и time().

Date/Time to Timestamp Conversion

strtotime() and mktime() functions are also used to convert specified date into the form of a timestamp.

For using strtotime(), we need to pass the date with any one of PHP supported date format, for example, dd/mm/yyyy, mm/dd/yyyy and etc. And, for using mktime(), we need to explode the given date and send the exploded components to this function.

And, we can perform the reverse, that is, converting timestamp value to date, by the use of date() function. For that, we should specify the required date format as the first parameter, and timestamp as the second one. For example,

<?php
$date_from_timestamp = date("d-m-Y",$current_timestamp);
echo "Formatted date from timestamp:" . $date_from_timestamp;
?>

Note:

  • These operations can also be performed in the object oriented style of programming, with the PHP functions defined under DateTime class interface.
  • On the other hand, certain PHP timestamp functions are in procedural style, which is the alias of class constructors defined for PHP DateTime object model.

Table of Contents

  • checkdate — Validate a Gregorian date
  • date_add — Alias of DateTime::add
  • date_create_from_format — Alias of DateTime::createFromFormat
  • date_create_immutable_from_format — Alias of DateTimeImmutable::createFromFormat
  • date_create_immutable — Alias of DateTimeImmutable::__construct
  • date_create — Alias of DateTime::__construct
  • date_date_set — Alias of DateTime::setDate
  • date_default_timezone_get — Gets the default timezone used by all date/time functions in a script
  • date_default_timezone_set — Sets the default timezone used by all date/time functions in a script
  • date_diff — Alias of DateTime::diff
  • date_format — Alias of DateTime::format
  • date_get_last_errors — Alias of DateTime::getLastErrors
  • date_interval_create_from_date_string — Alias of DateInterval::createFromDateString
  • date_interval_format — Alias of DateInterval::format
  • date_isodate_set — Alias of DateTime::setISODate
  • date_modify — Alias of DateTime::modify
  • date_offset_get — Alias of DateTime::getOffset
  • date_parse_from_format — Get info about given date formatted according to the specified format
  • date_parse — Returns associative array with detailed info about given date/time
  • date_sub — Alias of DateTime::sub
  • date_sun_info — Returns an array with information about sunset/sunrise and twilight begin/end
  • date_sunrise — Returns time of sunrise for a given day and location
  • date_sunset — Returns time of sunset for a given day and location
  • date_time_set — Alias of DateTime::setTime
  • date_timestamp_get — Alias of DateTime::getTimestamp
  • date_timestamp_set — Alias of DateTime::setTimestamp
  • date_timezone_get — Alias of DateTime::getTimezone
  • date_timezone_set — Alias of DateTime::setTimezone
  • date — Format a local time/date
  • getdate — Get date/time information
  • gettimeofday — Get current time
  • gmdate — Format a GMT/UTC date/time
  • gmmktime — Get Unix timestamp for a GMT date
  • gmstrftime — Format a GMT/UTC time/date according to locale settings
  • idate — Format a local time/date as integer
  • localtime — Get the local time
  • microtime — Return current Unix timestamp with microseconds
  • mktime — Get Unix timestamp for a date
  • strftime — Format a local time/date according to locale settings
  • strptime — Parse a time/date generated with strftime
  • strtotime — Parse about any English textual datetime description into a Unix timestamp
  • time — Return current Unix timestamp
  • timezone_abbreviations_list — Alias of DateTimeZone::listAbbreviations
  • timezone_identifiers_list — Alias of DateTimeZone::listIdentifiers
  • timezone_location_get — Alias of DateTimeZone::getLocation
  • timezone_name_from_abbr — Returns the timezone name from abbreviation
  • timezone_name_get — Alias of DateTimeZone::getName
  • timezone_offset_get — Alias of DateTimeZone::getOffset
  • timezone_open — Alias of DateTimeZone::__construct
  • timezone_transitions_get — Alias of DateTimeZone::getTransitions
  • timezone_version_get — Gets the version of the timezonedb

Когда не происходит CV оптимизация


Примечание переводчика: в оригинальной статье Никита Попов рассматривает вариант, когда CV оптимизации не срабатывают из-за использования оператора подавления ошибок . Но это происходит лишь в PHP 5.x, а в PHP 7 оптимизации работают в том числе и в этом случае. Поэтому перевод оригинала, применимый только к PHP 5 убран в спойлер, а мы же рассмотрим вариант, когда код из примеров работает по-другому из-за отсутствия CV оптимизаций в силу не использования CV.

CV оптимизация не выполняется, например, в случае обращения к элементам массивов или свойствам объектов.

Давайте проверим. Мы снова возьмем выражение , но в этот раз будем использовать обращение к элементу массива вместо переменной:

Теперь, когда мы начали использовать массив, результат неожиданно поменялся с 3 на 2. И чтобы выяснить почему, давайте взглянем на опкоды:

Как мы видим, обращение к элементу массива здесь происходит при помощи (для считывания) и (для чтения/записи) вместо прямого использования его в качестве операндов.

Именно потому, что получение операндов для сложения сейчас имеет отдельный опкод, оно будет происходить до инкремента, и результат будет другим.

PHP Predefined Date/Time Constants

Constant Description
DATE_ATOM Atom (example: 2019-01-18T14:13:03+00:00)
DATE_COOKIE HTTP Cookies (example: Fri, 18 Jan 2019 14:13:03 UTC)
DATE_ISO8601 ISO-8601 (example: 2019-01-18T14:13:03+0000)
DATE_RFC822 RFC 822 (example: Fri, 18 Jan 2019 14:13:03 +0000)
DATE_RFC850 RFC 850 (example: Friday, 18-Jan-19 14:13:03 UTC)
DATE_RFC1036 RFC 1036 (example: Friday, 18-Jan-19 14:13:03 +0000)
DATE_RFC1123 RFC 1123 (example: Fri, 18 Jan 2019 14:13:03 +0000)
DATE_RFC2822 RFC 2822 (example: Fri, 18 Jan 2019 14:13:03 +0000)
DATE_RFC3339 Same as DATE_ATOM (since PHP 5.1.3)
DATE_RFC3339_EXTENDED RFC3339 Extended format (since PHP 7.0.0) (example: 2019-01-18T16:34:01.000+00:00)
DATE_RSS RSS (Fri, 18 Jan 2019 14:13:03 +0000)
DATE_W3C World Wide Web Consortium (example: 2019-01-18T14:13:03+00:00)
SUNFUNCS_RET_TIMESTAMP Timestamp (since PHP 5.1.2)
SUNFUNCS_RET_STRING Hours:minutes (example: 09:41) (since PHP 5.1.2)
SUNFUNCS_RET_DOUBLE Hours as a floating point number (example: 9.75) (since PHP 5.1.2)

PHP Date/Time Functions

Function Description
checkdate() Validates a Gregorian date
date_add() Adds days, months, years, hours, minutes, and seconds to a date
date_create_from_format() Returns a new DateTime object formatted according to a specified format
date_create() Returns a new DateTime object
date_date_set() Sets a new date
date_default_timezone_get() Returns the default timezone used by all date/time functions
date_default_timezone_set() Sets the default timezone used by all date/time functions
date_diff() Returns the difference between two dates
date_format() Returns a date formatted according to a specified format
date_get_last_errors() Returns the warnings/errors found in a date string
date_interval_create_from_date_string() Sets up a DateInterval from the relative parts of the string
date_interval_format() Formats the interval
date_isodate_set() Sets the ISO date
date_modify() Modifies the timestamp
date_offset_get() Returns the timezone offset
date_parse_from_format() Returns an associative array with detailed info about a specified date, according to a specified format
date_parse() Returns an associative array with detailed info about a specified date
date_sub() Subtracts days, months, years, hours, minutes, and seconds from a date
date_sun_info() Returns an array containing info about sunset/sunrise and twilight begin/end, for a specified day and location
date_sunrise() Returns the sunrise time for a specified day and location
date_sunset() Returns the sunset time for a specified day and location
date_time_set() Sets the time
date_timestamp_get() Returns the Unix timestamp
date_timestamp_set() Sets the date and time based on a Unix timestamp
date_timezone_get() Returns the time zone of the given DateTime object
date_timezone_set() Sets the time zone for the DateTime object
date() Formats a local date and time
getdate() Returns date/time information of a timestamp or the current local date/time
gettimeofday() Returns the current time
gmdate() Formats a GMT/UTC date and time
gmmktime() Returns the Unix timestamp for a GMT date
gmstrftime() Formats a GMT/UTC date and time according to locale settings
idate() Formats a local time/date as integer
localtime() Returns the local time
microtime() Returns the current Unix timestamp with microseconds
mktime() Returns the Unix timestamp for a date
strftime() Formats a local time and/or date according to locale settings
strptime() Parses a time/date generated with strftime()
strtotime() Parses an English textual datetime into a Unix timestamp
time() Returns the current time as a Unix timestamp
timezone_abbreviations_list() Returns an associative array containing dst, offset, and the timezone name
timezone_identifiers_list() Returns an indexed array with all timezone identifiers
timezone_location_get() Returns location information for a specified timezone
timezone_name_from_ abbr() Returns the timezone name from abbreviation
timezone_name_get() Returns the name of the timezone
timezone_offset_get() Returns the timezone offset from GMT
timezone_open() Creates new DateTimeZone object
timezone_transitions_get() Returns all transitions for the timezone
timezone_version_get() Returns the version of the timezonedb

Возвращаемое значениеReturn Value

_mktime32 возвращает указанное Календарное время, закодированное как значение типа time_t._mktime32 returns the specified calendar time encoded as a value of type time_t. Если timeptr ссылается на дату до полуночи 1 января 1970, или если не удается представить Календарное время, _mktime32 возвращает-1 приведение к типу time_t.If timeptr references a date before midnight, January 1, 1970, or if the calendar time cannot be represented, _mktime32 returns -1 cast to type time_t. При использовании _mktime32 и если timeptr ссылается на дату после 23:59:59 18 января 2038 г., время в формате UTC, возвращает-1 приведение к типу time_t.When using _mktime32 and if timeptr references a date after 23:59:59 January 18, 2038, Coordinated Universal Time (UTC), it will return -1 cast to type time_t.

_mktime64 возвратит-1 приведение к типу __time64_t если timeptr ссылается на дату после 23:59:59, 31 декабря 3000, UTC._mktime64 will return -1 cast to type __time64_t if timeptr references a date after 23:59:59, December 31, 3000, UTC.

Get a Date

The required format parameter of the date() function specifies how to format the date (or time).

Here are some characters that are commonly used for dates:

  • d — Represents the day of the month (01 to 31)
  • m — Represents a month (01 to 12)
  • Y — Represents a year (in four digits)
  • l (lowercase ‘L’) — Represents the day of the week

Other characters, like»/», «.», or «-» can also be inserted between the characters to add additional formatting.

The example below formats today’s date in three different ways:

Example

<?phpecho «Today is » . date(«Y/m/d») . «<br>»;echo «Today is » . date(«Y.m.d») . «<br>»;echo «Today is » . date(«Y-m-d») . «<br>»; echo «Today is » . date(«l»);?>

Create a Date From a String With strtotime()

The PHP function is used to convert a human readable date string into a Unix timestamp (the number of seconds since January 1 1970 00:00:00 GMT).

strtotime(time, now)

The example below creates a date and time from the function:

Example

<?php$d=strtotime(«10:30pm April 15 2014»);echo «Created date is » . date(«Y-m-d h:i:sa», $d);?>

PHP is quite clever about converting a string to a date, so you can put in various values:

Example

<?php$d=strtotime(«tomorrow»);echo date(«Y-m-d h:i:sa», $d) . «<br>»;$d=strtotime(«next Saturday»);echo date(«Y-m-d h:i:sa», $d) . «<br>»;$d=strtotime(«+3 Months»);echo date(«Y-m-d h:i:sa», $d) . «<br>»;?>

However, is not perfect, so remember to check the strings you put in there.

Работа со временем высокой точности в MySQL

MySQL поддерживает три типа колонок, в которых можно хранить время: , и . Изначально в них можно было хранить только значения, кратные одной секунде (например, 2019-08-14 19:20:21). В версии 5.6.4, которая вышла в декабре 2011 года, появилась возможность работать и с дробной частью секунды. Для этого при создании колонки нужно указать количество знаков после запятой, которое необходимо хранить в дробной части метки времени. Максимальное количество знаков, которое поддерживается, — шесть, что позволяет хранить время с точностью до микросекунды. При попытке использовать большее количество знаков вы получите ошибку.

Пример:

В этом примере у метки времени вставленной записи нулевая дробная часть. Это произошло потому, что входящее значение было указано с точностью до секунды. Для решения проблемы нужно, чтобы точность входящего значения была такой же, как у значения в базе данных. Совет кажется очевидным, но он актуален, поскольку подобная проблема может всплыть в реальных приложениях: мы сталкивались с ситуацией, когда значение на входе имело три знака после запятой, а в базе данных хранилось шесть.

Самый простой способ предупредить возникновение этой проблемы — использовать входящие значения с максимальной точностью (до микросекунды). В этом случае при записи данных в таблицу время округлится до требуемой точности. Это абсолютно нормальная ситуация, которая не будет вызывать никаких warning-ов (предупреждений):

При использовании автоматической инициализации и автоматического обновления колонок типа TIMESTAMP с помощью конструкции вида важно, чтобы значения имели ту же точность, что и сама колонка:

Функции MySQL для работы со временем поддерживают работу и с дробной частью единиц измерения. Перечислять их все я не буду (предлагаю посмотреть в документации), но приведу несколько примеров:

Главная проблема, с которой сопряжено использование дробной части секунд в SQL-запросах, — несогласованность точности при сравнениях (, , ). С ней можно столкнуться в том случае, если данные в базе имеют одну точность, а в запросах — другую. Вот небольшой пример, иллюстрирующий эту проблему:

В данном примере точность значений в запросе выше, чем точность значений в базе, и проблема возникает «на границе сверху». В обратной ситуации (если значение на входе будет иметь точность ниже, чем значение в базе) проблемы не будет — MySQL приведёт значение к нужной точности и в INSERT-е, и в SELECT-е:

Согласованность точности значений всегда стоит держать в голове при работе со временем высокой точности. Если подобные граничные проблемы для вас критичны, то нужно следить за тем, чтобы код и база данных работали с одинаковым количеством знаков после запятой.

См. также:

  • “Fractional Seconds in Time Values”;
  • “Automatic Initialization and Updating for TIMESTAMP and DATETIME”;
  • “Date and Time Functions”.

Runtime Configuration

The behavior of these functions is affected by settings in php.ini:

Name Description Default PHP Version
date.timezone The default timezone (used by all date/time functions) «» PHP 5.1
date.default_latitude The default latitude (used by date_sunrise() and date_sunset())  «31.7667» PHP 5.0
date.default_longitude The default longitude (used by date_sunrise() and date_sunset()) «35.2333» PHP 5.0
date.sunrise_zenith The default sunrise zenith (used by date_sunrise() and date_sunset()) «90.83» PHP 5.0
date.sunset_zenith The default sunset zenith (used by date_sunrise() and date_sunset()) «90.83» PHP 5.0

С этим читают