PHP Manual

Функція PHP date(), дата і час

11. 09. 2019

Obsah článku

Функція `date()` є інструментом для роботи з датою та часом. Застосовується у двох випадках:

  • Знаходження поточного стану**, тобто поточної дати, часу, ... та виведення її у визначеному форматі,
  • перетворення конкретної дати в інший формат (наприклад, номер місяця в назву, формат позначення року, 12- та 24-годинна система, ...).

Зразок

Já jsem speciální stránka. Vím, že právě je
<?php
echo date('H:i'); // Hodina:minuta
?>

УВАГА: PHP виводить не ваш час, а час на сервері. Тому ви можете отримати час, який відрізняється від часу, встановленого на вашому комп'ютері.

Синтаксис вхідних даних

Функція викликається звичайним чином і окремі запити вводяться як аргументи функції.

echo date('знаки форматування', atribut konkrétního času);

Знаки форматування вказують, в якому форматі буде надрукована дата. Знаками можуть бути пробіли, крапки, двокрапки, дефіси, дефіси та інші символи, які самі по собі не є знаками форматування (якщо ви хочете використати знак форматування, ви повинні утілити його). Нижче наведено огляд кожного тегу.

Другий (необов'язковий) атрибут вказує на введену вручну дату або час, які будуть конвертовані та виведені у форматі згідно з першим параметром. Вона повинна бути вказана у вигляді мітки часу (може бути отримана за допомогою тегу форматування "U").

Приклад:

echo date('д. м. Y', 1405856605); // від 20. 07. 2014 р.

Таблиця допустимих знаків форматування

Символ Опис
Y Рік у вигляді чотирьох цифр (наприклад, 1998)
y Рік у вигляді двозначного числа (наприклад, 98)
M англійська абревіатура назви місяця (наприклад, Jan)
Номер місяця (01-12)
F Назва місяця англійською мовою (наприклад, січень)
D англійська абревіатура дня тижня (наприклад, Fri)
l англійська назва дня тижня (наприклад, п'ятниця)
Номер дня тижня (1 - понеділок, 7 - неділя)
w Номер дня тижня (0 - неділя, 1 - понеділок, 6 - субота)
День місяця (01-31)
j Номер дня місяця (1-31)
День року (001-365)
Година (00-23)
Година (01-12)
Хвилина (00-59)
Друга (00-59)
Штемпель часу: Кількість секунд від початку відліку часу (з 1 січня 1970 року)
S англійське закінчення порядкового номера дня місяця
Індикатор АМ/ПМ
a Ранковий/полуденний індикатор (ранок/вечір)
P Відмінність від часу за Гринвічем (GMT) з роздільником між годинами і хвилинами (додано в PHP 5.1.3), наприклад: +02:00.
Година в 12-годинному форматі (1-12)
Година в 24-годинному форматі (0-23)

Форматування часу для карти сайту

Дуже часто потрібно відформатувати час для файлу itemap.xml, який містить дату і час останньої зміни в тезі <lastmod>.

Починаючи з версії PHP 5.1.3, для цього можна використовувати наступний синтаксис:

date('Y-m-d\TH:i:sP');

Дата і час будуть відображатися з точністю до секунди, а також міститимуть інформацію про часовий пояс, в якому знаходиться сервер (часовий пояс визначається операційною системою сервера).

Отримання чеських назв днів і місяців

Отримати чеські назви днів і місяців в PHP звичайним способом неможливо, тому доводиться писати такі значення самостійно. Найкращий спосіб - зберігати записи в масиві та отримувати їх за допомогою індексного виклику.

$mesice = [
1 => 'січень', 'лютий', 'Березень', 'квітень', 'травень',
'червень', 'липень', 'серпень', 'вересень', 'жовтень',
'листопад', 'грудень'
];
$dny = ['Неділя', 'Понеділок', 'Вівторок', 'Середа', 'Четвер', 'П'ятниця', 'Субота'];

Цей приклад є спрощеним прикладом з Jakub Vrana зі статті Чеські назви місяців і днів тижня.

Переклад дат з англійської мови на англійську

Ми часто маємо дату у форматі "п'ятниця, 13 вересня" і хочемо перекласти її на англійську мову, але як це зробити? Найкращий спосіб - викликати якусь функцію, наприклад datumcesky(), якій ми передаємо англійську дату і вона її перекладає.

function datumCesky(string $date): string
{
$men = [
'січень', 'лютий', 'Березень', 'квітень', 'травень',
'червень', 'липень', 'серпень', 'вересень', 'жовтень',
'листопад', 'грудень'
];
$mcz = [
'січень', 'лютий', 'Березень', 'квітень', 'травень',
'червень', 'липень', 'серпень', 'вересень', 'жовтень',
'листопад', 'грудень'
];
$date = str_replace($men, $mcz, $date);
$den = [
'Понеділок', 'Вівторок', 'Середа', 'Четвер',
'П'ятниця', 'Субота', 'Неділя'
];
$dcz = [
'Понеділок', 'Вівторок', 'Середа', 'Четвер',
'П'ятниця', 'Субота', 'Неділя'
];
return str_replace($den, $dcz, $date);
}

Приклад використання:

echo datumCesky('П'ятниця, 13 вересня'); // П'ятниця, 13 грудня

Ця функція, безумовно, не є ідеальною для перекладу, оскільки вона лише замінює англійські слова на чеські, але вона може бути достатньою для багатьох розгортань. Для більш складних перекладів завжди слід гарантувати точний синтаксис для перекладу в єдиному стилі, наприклад, "п'ятниця, 13 грудня".

Знаходження першого числа місяця

Перший день квітня 2018 року припав на неділю, але як це легко з'ясувати?

Починаючи з версії PHP 5.1.0, є просте рішення:

echo date('N', strtotime('2018-04-01')); // 1 (понеділок), 7 (неділя)

У старих версіях нам доводиться реалізовувати цю функцію самостійно:

/**
* @автор Ян Барашек
*/
function getFirstDayPosition(?int $year = null, ?int $month = null): int
{
$day = (int) date('w', strtotime($year . '-' . $month . '-1')) - 1;
return $day < 0 ? 7 : $day + 1;
}

Оскільки модифікатор w повертає виведення в американському форматі, я все одно коригую номер дня простим обчисленням. Функція повертає ціле число від 1 (понеділок) до 7 (неділя).

Перетворення часових зсувів / форматування та перевірка дати

Часто нам потрібно переходити на відносний час (скажімо, +5 днів) або витягувати дату з тексту, введеного користувачем, щоб зробити її дійсною. Для цього функція strtotime() допускає наступний синтаксис:

echo strtotime('зараз');
echo strtotime('10 вересня 2000 року');
echo strtotime('+1 день');
echo strtotime('+1 тиждень');
echo strtotime('+1 тиждень 2 дні 4 години 2 секунди');
echo strtotime('наступного четверга');
echo strtotime('минулого понеділка');

Виходом функції є мітка часу (всесвітній час) вказаного часу у вигляді цілого числа.

Взагалі рекомендую розгорнути цю функцію на всіх формах, де ми так чи інакше працюємо з часом від користувача. Звичайно, не варто змушувати користувача писати дату в якомусь конкретному форматі, але завжди створюйте такий формат автоматично, щоб користувач міг писати все, що він хоче. Тому що часто текст, наприклад, звідкись копіюється, і переформатовувати його вручну, коли це можна зробити автоматично, занадто багато роботи.

Кількість секунд від початку відліку часу

З 1 січня 1970 року кожна секунда додається до одиниці, щоб отримати величезне ціле число, яке вказує на час, що минув відтоді. Це особливо корисно для простого розрахунку різниці в часі. Це досить надійне рішення, але воно має свої ризики (проблема 2038 року).

Загальні властивості цього позначення:.

  • Це ціле число, тому з ним легко працювати,
  • Він у десятковій системі, тому людині легко його читати (за винятком того, що не можна швидко сказати, котра зараз година),
  • Його не можна використовувати для представлення періоду до 1 січня 1970 року, оскільки він не може бути від'ємним (деякі нові версії алгоритму реалізують від'ємний час, але на це не завжди можна покладатися),
  • У 2038 році він перестане працювати на 32-бітних комп'ютерах і призведе до аварійного завершення роботи програми (через переповнення стеку та максимальний розмір цілого числа).

Проблема 2038 року

Я не читаю...

.

Над цим текстом відображається поточне значення часу, яке щосекунди збільшується на +1. Поточне значення завантажується за допомогою javascript, тому може бути не завжди точним (вказує на системний час вашого комп'ютера).

Комп'ютери зберігають цілі числа у двійковій формі, і якщо це ціле число, то воно часто має 32 біти (32 одиниці та нулі). Максимально можливе 32-бітне число: 011 111 111 111 111 111 111 111 111 111 11.

Однак, якщо до цієї константи щосекунди додавати +1, то одного разу ми отримаємо таке число (це буде 19 січня 2038 року о 03:14:07). Однак, коли ми спробуємо додати ще 1, розрядності вже не вистачить (число буде більшим, ніж може зберігатися в 32 бітах), тому відбудеться переповнення стеку, тобто до початку числа буде додано 1, що в двійковій формі означає від'ємне число, (тому це, ймовірно, призведе до аварійного завершення програми), в результаті чого ми опинимося десь в 1901 році (тьху!).

Є два варіанти вирішення цієї проблеми:

  • Розширення цілочисельного діапазону з 32 біт до 64 біт, що дає нам проміжок часу в кілька тисяч років
  • Використовується тип даних \DateTime\\ (широко доступний в PHP), який забезпечує об'єктно-орієнтований підхід до управління датами, добре сумісний з базою даних і пропонує діапазон років від 0001до9999`, що є достатнім для потреб більшості реальних додатків.

Особисто я виступаю за те, щоб використовувати тип даних `\DateTime\ і взагалі не використовувати цілочисельні сховища.

Різні часові пояси

PHP є інтелектуальним, тому він завжди намагається використовувати найкращий на даний момент часовий пояс, в якому знаходиться сервер. Однак іноді може статися так, що часовий пояс вказано невірно, або ми програмуємо глобальний додаток, до якого звертаються користувачі з усього світу і тому нам потрібно вручну змінити часовий пояс.

Це можна зробити глобально для всього PHP-скрипта, викликавши функцію:

date_default_timezone_set('UTC');

Іноді можна зустріти і таке рішення (виявлення того, що сервер має часовий пояс, відмінний від UTC):

$defaultTimeZone = 'UTC';
if (date_default_timezone_get() != $defaultTimeZone) {
date_default_timezone_set($defaultTimeZone);
}

Змінити дату та час

За отримання поточної дати і часу відповідає не сам PHP, а операційна система, на якій він працює. Тому якщо вам потрібно вручну змінити час, змініть його там.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
6.
Status:
All systems normal.
2024