Написав статью о том как манипулировать датой используя API 1с-Битрикс, хочу вкратце поделиться знаниями, как работать с датой на php. В статье разберем:
как получить текущую дату и время?
как отформатировать дату в нужный вид?
как осуществить проверку даты, которую ввел пользователь?
Как получить текущую дату и время?
В PHP есть функция time(), которая возвращает текущее время, только возвращаемое значение имеет вид: 1351969458. Вы спросите: что это? Дело в том, что функция time() возвращает время в формате UNIX (UNIX объявляет время так: они подсчитывают количество секунд, прошедших с ночи 1-ого января 1970-го года). Кстати число 1351969458 символизирует: дату: 3 Ноября 2012 года, время: 23:04.
Вот собственно секрет получения текущей даты.
1
2
3
4
<?
echo time();
/* Результат: 1351969458; */
?>
Как отформатировать дату в нужный вид?
И вот получив текущую дату, нам надо ее преобразовать в нужный для нас вид. Для преобразования даты используется функция date(). Пример использования:
1
2
3
4
<?
echo date( 'H:i l d F Y', time() );
/* Результат: 23:19 Saturday 03 November 2012; */
?>
Весь список кодов форматирования функции date() можно посмотреть в конце статьи.
Функция date() - первый способ получить отформатированную дату и время. Минусы в том, что использование этой функции раздражающе, если вывод даты необходимо сделать по особенному, например: "Сегодня 3 Ноября 2012 года, московское время 23:20".
Для того чтобы сделать индивидуальный, читабельный вид даты, необходимо использовать функцию getdate(). Эта функция возратит массив с данными текущей даты и времени:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
$arDate = getdate(time());
echo "<pre>";print_r($arDate);echo "</pre>";
/* Результат:
Array
(
[seconds] => 20 - секунды
[minutes] => 31 - минуты
[hours] => 23 - часы
[mday] => 3 - день месяца
[wday] => 6 - день недели (число)
[mon] => 11 - месяц
[year] => 2012 - год
[yday] => 307 - день года
[weekday] => Saturday - день недели (слово)
[month] => November - месяц (слово)
[0] => 1351971080 - дата в UNIX формате
)
*/
?>
Получив массив с датой и временем, мы можем составить любую строку. Например, чтобы вывести строку: "Сегодня 3 Ноября 2012 года, московское время 23:20", необходимо:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$arMonth = Array(
1=>"Января",
2=>"Февраля",
3=>"Марта",
4=>"Апреля",
5=>"Мая",
6=>"Июня",
7=>"Июля",
8=>"Августа",
9=>"Сентября",
10=>"Октября",
11=>"Ноября",
12=>"Декабря"
);
$arDate = getdate(time());
echo "Сегодня $arDate["mday"] $arMonth[$arDate["mon"]] $arDate["year"] года, московское время $arDate["hours"]:$arDate["minutes"]";
/* Результат:
Сегодня 3 Ноября 2012 года, московское время 23:20
*/
?>
Как получить и отформатировать текущую дату и время мы разобрали, а как отформатировать будущую дату или прошедший день? Для этого необходимо использовать функцию mktime(). Эта функция возвращает время в UNIX формате по введенной дате, а как преобразовать это число в нужный вид было рассказано выше.
Синтаксис функции такой:
mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] ), где
hour - час,
minute - минута,
second - секунда,
month - месяц
day - день
year - год
is_dst - может установлен в 1 - если заданной дате соответствует летнее время, 0 зимнее, или -1 (значение по умолчанию), если неизвестно, действует ли летнее время на заданную дату.
Примеры:
1
2
3
4
5
6
7
8
9
10
<?
echo mktime(0, 0, 0, 12, 31, 2012);
/* Результат: 1356897600 */
/* Преобразовать строку даты 31.12.2012 */
$str_date = "31.12.2012";
$arStr = explode(".", $str_date);
echo mktime(0, 0, 0, $arStr[1], $arStr[0], $arStr[2]);
/* Результат такой же: 1356897600 */
?>
Как осуществить проверку даты, которую ввел пользователь?
Для проверки правильности ввода даты, есть функция checkdate(). Синтаксис функции: checkdate (int month, int day, int year).
Данная функция проверяет, является ли месяц — целым числом от 1 до 12, год целым числом от 0 до 32767, и что указанное число существует в заданном месяце, checkdate() учитывает также високосные годы. Например:
1
2
3
4
<?
checkdate (11, 3, 2012); /* вернет true */
checkdate (9, 31, 2012); /* вернет false*/
?>
Вот собственно все основы по работе с датой и временем. Спасибо за внимание!
И как обещал привожу таблицу с кодами для функции date():
a Время до или после полудня, представленное двумя строчными буквами: am или pm
A Время до или после полудня, представленное двумя прописными буквами: AM или PM
B Интернет-время Swatch —универсальная временная схема. Более подробно о ней можно узнать на сайте http://www.swatch.com
c Дата в соответствии со стандартом ISO 8601. Дата представлена в виде ГГГГ-MM-ДД. Прописная буква Т отделяет дату от времени. Время представлено в виде ЧЧ-ММ-СС. Завершает строку часовой пояс, представленный как смещение от среднего времени по Гринвичу, например, 2011-03-17Т16:08:42 + 2:00
d День месяца в виде двузначного числа с ведущим нулем. Диапазон значений —от 01 до 31.
D День недели в виде английской трехбуквенной аббревиатуры. Диапазон значений — от Mon (понедельник) до Sun (воскресенье).
F Полное английское название месяца. Диапазон значений — от January (январь) до December (декабрь).
g Часы в 12-часовом формате без ведущих нулей. Диапазон значений —от 1 до 12.
G Часы в 24-часовом формате без ведущих нулей. Диапазон значений —от 0 до 23.
h Часы в 12-часовом формате с ведущими нулями. Диапазон значений —от 01 до 12.
H Часы в 24-часовом формате с ведущими нулями. Диапазон значений —от 00 до 23.
i Минуты с ведущими нулями. Диапазон значений от 00 до 59.
I Признак применения летнего времени, представленный логическим значением. Если летнее время, возвращается значение 1, иначе 0.
j День месяца в виде числа без ведущих нулей. Диапазон значений от 1 до 31.
l Полное английское название недели. Диапазон значений от Monday (понедельник) до Sunday (воскресенье).
L Високосный год, представленный логическим значением. Возвращает значение 1, если дата принадлежит високосному году, и 0 в противном случае.
m Номер месяца в двузначном числовом формате с ведущими нулями. Диапазон значений от 01 до 12.
M Месяц в виде английской трехбуквенной аббревиатуры. Диапазон значений от Jan (январь) до Dec (декабрь).
n Номер месяца без ведущих нулей. Диапазон значений от 1 до 12.
O Разница между текущим часовым поясом и GMT в часах, например, +1600.
r Дата и время в формате, заданном в RFC822, например, Wed, 9 Jun 2011 18:45:30 + 1600
s Секунды с ведущими нулями. Диапазон значений от 00 до 59.
S Порядковый суффикс для дат в двубуквенном формате. Он может принимать значение st, nd, rd или th в зависимости от числа, за которым следует.
t Полное количество дней в месяце даты. Диапазон значений от 28 до 31.
T Часовой пояс сервера в трехбуквенном формате, например, EST.
U Число секунд с 1 января 1970 года до текущего момента; его также называют меткой времени Unix для текущей даты.
w Номер дня недели в виде однозначного числа. Диапазон значений от 0 (воскресенье) до 6 (суббота).
W Номер недели в году в формате ISO-8601.
y Год в двузначном формате, например, 11.
Y Год в четырехзначном формате, например, 2011.
z День года в виде числа.Диапазон значений от 0 до 365.
Z Смещение текущего часового пояса в секундах. Диапазон значений от -43200 до 43200.