Содержание
В распределенных системах, таких, как Интернет, время играет особую роль. Из-за незначительного расхождения системных часов игрок на рынке Forex может потерять десятки тысяч долларов в течение нескольких минут; система деловой разведки ошибется в составлении прогноза; серверы NNTP в процессе синхронизации потеряют важную информацию, нужную пользователю и т.д.
PHP содержит множество функций для работы с датой и временем. Наиболее употребимыми являются:
- time( ) — возвращает текущее абсолютное время. Это число равно количеству секунд, которое прошло с полуночи 1 января 1970 года (с начала эпохи UNIX).
- getdate( ) — считывает информацию о дате и времени. Возвращает ассоциативный массив, содержащий информацию по заданному или по текущему (по умолчанию) времени. Массив содержит следующие элементы:
seconds | Секунды (0-59) |
minutes | Минуты (0-59) |
hours | Часы (0-23) |
mday | День месяца (1-31) |
wday | День недели (0-6), начиная с воскресенья |
mon | Месяц (1-12) |
year | Год |
yday | День года (0-365) |
weekday | Название дня недели (например, Friday) |
month | Название месяца (например, January) |
Абсолютное время |
Пример 1
a | Включено обозначение "am" или "pm" |
A | Включено обозначение "AM" или "PM" |
d | День месяца (01-31) |
D | Сокращенное название дня недели (три буквы) |
F | Полное название месяца |
g | Часы (12-часовой формат без ведущих нулей) |
G | Часы (24-часовой формат без ведущих нулей) |
h | Часы (12-часовой формат) |
H | Часы (24-часовой формат) |
i | Минуты (00-59) |
j | День месяца без ведущих нулей (1-31) |
l | Полное название дня недели |
L | Признак високосного года (0 или 1) |
m | Месяц (01-12) |
M | Сокращенное название месяца (три буквы) |
n | Месяц (1-12) |
s | Секунды (00-59) |
t | Количество дней в данном месяце (от 28 до 31) |
U | Абсолютное время |
w | Номер дня недели (0 — воскресенье, 6 — суббота) |
y | Год (два разряда) |
Y | Год (четыре разряда) |
z | День года (0-365) |
Z | Смещение часового пояса в секундах (от -43200 до 43200) |
Любая другая информация, включенная в строку формата, будет вставлена в возвращаемую строку. Если в строку формата нужно добавить символы, которые сами по себе являются кодами формата, то перед ними надо поставить обратную косую черту "". Символы, которые становятся кодами формата при добавлении к ним обратной косой, нужно предварять двумя косыми. Например, если необходимо добавить в строку "n", то надо ввести "\n", поскольку "
" является символом новой строки.
Пример 2
mktime( ) — возвращает абсолютное время, которое затем можно использовать с функциями date() или getdate(). Принимает до шести целочисленных аргументов в следующем порядке:
часы
минуты
секунды
месяц
день месяца
год
Пример 3
Внимание! Дата может находиться в допустимом диапазоне, но остальные функции работы с датами не примут это значение. Так, нельзя использовать mktime() для годов до 1902, а также следует использовать ее осторожно для годов до 1970.
strftime( ) — формирование локальной даты и времени. Аргументы: строка формата и абсолютное время. Второй аргумент необязателен. Возвращает строку с заданной или текущей датой в указанном формате. При этом названия месяцев и дней недели извлекается из локали, выбранной с помощью функции setlocate( ) Строка формата может содержать следующие коды:
%a | Сокращенное название дня недели |
%A | Полное название дня недели |
%b | Сокращенное название месяца |
%B | Полное название месяца |
%c | Предпочтительный формат даты и времени |
%C | Номер века |
%d | День месяца (1-31) |
%D | То же, что и %m/%d/%y |
%e | Месяц (1-12) |
%h | То же, что и %b |
%H | Часы (24-часовой формат) |
%I | Часы (12-часовой формат) |
%j | День года (0-365) |
%m | Месяц (1-12) |
%M | Минуты |
%n | Символ новой строки |
%p | Включено обозначение "am" или "pm" |
%r | Время с использованием a.m./p.m.-нотации |
%R | Время в 24-часовом формате |
%S | Секунды (00-59) |
%t | Символ табуляции |
%T | То же, что и %H:%M:%S |
%u | Номер дня недели (1 — понедельник, 7 — воскресенье) |
%U | Номер недели. Отсчет начинается с первого воскресенья года |
%V | Номер недели по ISO 8601:1988. Первая неделя должна иметь не менее четырех дней, а понедельник считается первым днем |
%W | Номер недели. Отсчет начинается с первого понедельника года |
%w | Номер дня недели (0 — воскресенье, 6 — суббота) |
%x | Предпочтительный формат даты без времени |
%X | Предпочтительный формат времени без даты |
%y | Год (два разряда) |
%Y | Год (четыре разряда) |
%Z | Часовой пояс (имя или сокращение) |
%% | Символ "%" |
Любая другая информация, включенная в строку формата, будет вставлена в возвращаемую строку.
Дату иногда очень удобно преобразовывать в количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT). Преобразование производится функцией int strtotime ( string time [, int now]) .
В качестве параметра time можно передавать такие варианты даты как: last Week, last Year, +1 day и т.д.
У меня есть строка, равная дате, представленная в виде количества миллисекунд с начала Unix.
Я пытаюсь вывести его в д-м-у.
Мне дали строку «1227643821310», и мне сказали, что результат должен быть равен 2-12-2008, но я продолжаю получать результат 25-11-2008
Мой код выглядит следующим образом:
Есть идеи, почему это может быть?
Решение
Вы уже делаете это правильно, 1227643821 просто не 02-12-2008, это действительно 25-11-2008.
Другие решения
Я просто добавил H: i: s как в примере ниже:
Единственное, о чем я могу думать, это попытаться округлить десятичную часть перед преобразованием ее в дату. Если это не меняет результат, то результат правильный.
Джефф, важно понимать, когда имеешь дело с метками времени: они представляют время, прошедшее с 0:00:00 01.01.1970. по Гринвичу, не в вашем часовом поясе (если, конечно, вы сами не в Гринвиче).
1227643821 действительно представляет время по Гринвичу 20:10:21 25.11.2008.
Это 25 ноября 2008 года в большинстве стран мира, однако в часовых поясах к востоку от Москвы (и в самом московском часовом поясе летом из-за перехода на летнее время) это уже 26 ноября. Поскольку самый «экстремальный» восточный часовой пояс — GMT + 14, в мире нет места, где отметка времени 1227643821 могла бы представлять дату позже 26-го.
Автор оригинального значения мог как-то ошибиться при работе с часовыми поясами. Или просто ошибаюсь. Например, при вычислении значения добавляются секунды, а не миллисекунды на каком-то шаге.