Php преобразовать дату в timestamp

Php преобразовать дату в timestamp

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

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

В PHP работа с датой чаще всего сталкивается с UNIX TIMESTAMP. Здесь время хранится целым числом. Исчисление времени начинается с 1 января 1970 года. Поэтому, например, дата и время 11.12.2014 19:40:00, будет представлено числом 1418316000. Эта цифра показывает, сколько секунд прошло с нулевой даты 1 января 1970 года, названой Эпохой Unix.

Пример php-страницы, предоставляющий возможности преобразования данных представлен на сайте в разделе программ программой "Преобразование формата даты и времени". Здесь можно сформировать нужную дату в формат UNIX TIMESTAMP, а так же привести этот формат в стандартный, понятный человеку вид.

Получение текущего времени и даты в PHP

Для получения текущего времени сервера используется функция

которая как раз вернет значение в формате unix timestamp.

echo time(); // вывод текущего времени в формате unix timestamp

На первый взгляд не очень удобный формат для человека, но, как известно, чем проще представление данных, тем быстрее выполняется обработка этих значений компьютером. Кроме того, хранение числа в базе данных намного экономичнее, чем какой-либо специальный формат. Так же, PHP работает со временем одинаково и на Unix и на Windows платформе, что обеспечивает возможность использовать код на любой из этих платформ.

Преобразование формата даты и времени в PHP

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

array getdate([int timestamp])

Она возвращает ассоциативный массив, содержащий информацию о дате. Если параметр timestamp не указан, будут возвращены сведения о текущем времени. Этот массив содержит следующие значения:

seconds секунды (0-59)
minutes минуты (0-59)
hours часы (0-23)
mday день месяца (1-31)
wday день недели (0-6), начиная с воскресенья
mon месяц (1-12)
year год
yday день года (0-365)
weekday название дня недели (например, Monday)
month название месяца (например, January)
количество секунд, прошедших с начала Эпохи Unix

Полученный массив, позволяет вывести значения нужном виде:

$date = 1418372345; // исходное дата и время 12.12.2014 11:19:05
$date_mas = getdate($date);
echo $date_mas[ ‘mday’ ] . ‘ . ‘ . $date_mas[ ‘mon’ ] . ‘ . ‘ . $date_mas[ ‘year’ ]; // 12.12.2014

Так же для преобразования формата даты и времени можно воспользоваться функцией:

string date(string $template [, int $unix_timestamp])

Она предназначена для получения текущей даты unix timestamp в нужном формате. Строковый параметр $template определяет формат вывода. Параметром $unix_timestamp можно задать, с каким значением времени производится работа. Он необязательный, поэтому, если его не указать, будет использоваться текущая дата и время.

Формат задается следующими значениями:

a "до" и "после" полудня: "am" или "pm"
A "до" и "после" полудня заглавными буквами: "AM" или "PM"
d день месяца 2 цифрами (если меньше 10, на первом месте ноль) (от 01 до 31)
D день недели 3 буквами. Например, "Mon" (понедельник)
j день месяца, 1-2 цифры без начальных нулей (от 1 до 31)
F название месяца. Например, "January"
h час, 12-часовой формат (от 01 до 12)
H час, 24-часовой формат (от 00 до 23)
g час, 12-часовой формат без нулей (от 1 до 12)
G час, 24-часовой формат без нулей (от 0 до 23)
i минуты (от 00 до 59)
I (заглавная i) 1, если действует переход на летнее время, иначе 0
L 1, если год високосный, или 0 если не високосный
B время в формате Интернет-времени (альтернативной системы отсчета времени суток) (от 000 до 999)
T временная зона компьютера. Например, MDT
l (строчная L) день недели. Например, "Monday"
m месяц, две цифры с нулями (от 01 до 12)
n месяц, одна-две цифры без нулей (от 1 до 12)
M сокращенное наименование месяца. Например, "Jan"
t число дней в указанном месяце (от 28 до 31)
s секунды (от 0 до 59)
S англоязычный порядковый суффикс числа из двух букв ("st", "nd", "rd" или "th")
U целое число секунд, прошедших с момента начала эпохи UNIX
y год, цифровой, 2 цифры (14)
Y год, цифровой, 4 цифры (2014)
z порядковое число дня в году (от 0 до 365)
Z смешение временной зоны в секундах (от -43200 до 43200)
N порядковый номер дня недели от 1 (понедельник) до 7 (воскресенье) в соответствии со стандартом ISO-8601, (добавлен в версии PHP 5.1.0)
w порядковый номер дня недели от 0 (воскресенье) до 6 (суббота)
W порядковый номер недели года в соответствии со стандартом ISO-8601; недели начинаются с понедельника (добавлено в версии PHP 4.1.0)
o номер года в соответствии со стандартом ISO-8601. Имеет то же значение, что и Y, кроме случая, когда номер недели ISO (W) принадлежит предыдущему или следующему году; тогда будет использован год этой недели. (добавлен в версии PHP 5.1.0)
e код шкалы временной зоны. Например: UTC, GMT, Atlantic/Azores (добавлен в версии PHP 5.1.0)
O разница с временем по Гринвичу, в часах. Например: +0200
P разница с временем по Гринвичу с двоеточием между часами и минутами. Например: +02:00 (добавлено в версии PHP 5.1.3)
c дата в формате стандарта ISO 8601. Например, 2014-12-12T15:19:21+00:00 (добавлено в PHP 5)
r дата в формате » RFC 2822. Например: Thu, 21 Dec 2000 16:01:07 +0200
U количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970 00:00:00 GMT)
Читайте также:  Canon g3400 сброс памперса бесплатно

Как видно из списка, с помощью этой функции можно получить очень много полезных данных о дате. Например:

$date = 1418372345; // исходное дата и время 12.12.2014 11:19:05

echo date( ‘d.m.Y’ , $date); // 12.12.2014 (дата)
echo date( ‘H:i:s’ , $date); // 11:19:05 (время)
echo date( ‘H:i’ , $date); // 11:19 (время)
echo date( ‘t’ , $date); // 31 (число дней в месяце)
echo date( ‘z’ , $date); // 345 (порядковый номер дня в году)
echo date( ‘l dS of F Y h:i:s A’ , $date); // Friday 12th of December 2014 11:19:05 AM

Другие символы, входящие в шаблон, будут выведены в строке как есть. Если же потребуется ввести символ, который используется в функции как код формата, перед ними вставляется символ "". Для значения "
" (символ перехода на новую строку), следует указать "\n". Таким образом, можно делать вывод целого сообщения, содержащего сведения о дате и времени:

echo date( ‘Сегодня z-й день Y-го года’ , $date); // Сегодня 345-й день 2014-го года

Преобразование даты и времени в формат timestamp

Для обратного преобразования даты из стандартного формата в числовое значение timestamp применяется функция:

int mktime([int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]])

Функция mktime() возвращает значение времени Unix, соответствующую дате и времени, заданным аргументами. Например:

$my_date = mktime (10, 30, 0, 12, 12, 2014);

Следует внимательно относится к порядку аргументов функции: часы, минуты, секунды, месяц, день, год.

Кроме простого формирования значения даты в timestamp, функцию mktime() можно использовать для арифметически вычисления с датами. Для этого просто можно ввести необходимые аргументы. Например, если указать 14 месяц, то в итоговом значении, месяц будет 2-й, а значение года увеличится на единицу:

Читайте также:  Doctor web проверка на вирусы

$my_day = 12;
$my_month = 12;
$my_year = 2014;

$new_date = mktime(0, 0, 0, $my_month + 5, $my_day, $my_year);

echo date( ‘d.m.Y’ , $new_date); // 12.05.2015 (дата)

Аналогично можно поступать и с другими параметрами.

Проверка корректности даты в PHP

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

bool checkdate(int month, int day, int year)

Возвращает true если дата, заданная аргументами, является правильной; иначе возвращает false. Дата считается правильной, если:

— год в диапазоне от 1 до 32767;

— месяц в диапазоне от 1 до 12;

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

Пример проверки даты:

$my_day = 32;
$my_month = 12;
$my_year = 2014;

if (!checkdate($my_month, $my_day, $my_year))
echo ‘Ошибка: дата указана некорректно’ ;

Как получить временную метку, например, 22-09-2008 ?

PHP strtotime() дает

Что работает с документами поддерживаемых дат и времени .

Существует также strptime() который ожидает ровно один формат:

Будьте осторожны с функциями, такими как strtotime() которые пытаются «угадать» то, что вы имеете в виду (это, конечно, не догадывается, правила здесь ).

Действительно, 22-09-2008 будет проанализирован 22 сентября 2008 года , поскольку это единственная разумная вещь.

Как будет анализироваться 08-09-2008? Вероятно, 09 августа 2008 года .

Как насчет 2008-09-50 ? Некоторые версии PHP анализируют это как 20 октября 2008 года .

Итак, если вы уверены, что ваш вход находится в формате DD-MM-YYYY , лучше использовать решение, предлагаемое @Armin Ronacher .

То же самое с процедурным API:

Если вышеуказанное не работает, потому что вы используете неподдерживаемый формат , вы можете использовать

Обратите внимание, что если вы не установите ! , временная часть будет установлена ​​на текущее время, которое отличается от первых четырех, которое будет использовать полночь, когда вы опустите время.

Еще одна альтернатива – использовать API IntlDateFormatter :

Если вы не работаете с локализованными строками даты, проще выбрать DateTime.

Если у вас PHP 5.3 или выше,

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

Если вам не нужен часовой пояс или вы хотите использовать часовой пояс, который использует ваш сервер:

1222093324 (Это будет отличаться в зависимости от вашего часового пояса сервера …)

Если вы хотите указать, в каком часовом поясе, здесь EST. (То же, что и Нью-Йорк.)

1222093305

Или если вы хотите использовать UTC. (То же, что и «GMT».)

1222093289

Это очень простое и эффективное решение с использованием функций split и mtime :

Читайте также:  File not found exception c

Это работало как прелесть для меня.

Используя функцию strtotime (), вы можете легко преобразовать дату в метку времени

Учитывая, что функция strptime() не работает для Windows, и strtotime() может возвращать неожиданные результаты, я рекомендую использовать date_parse_from_format() :

Если вы хотите точно знать, будет ли синтаксическая обработка даты ожидаемой, вы можете использовать DateTime::createFromFormat() :

Это очевидно в этом случае, но, например, 03-04-2008 может быть 3 апреля или 4 марта в зависимости от того, откуда вы пришли 🙂

Если вы знаете, что формат использует strptime потому что strtotime делает предположение для формата, что может не всегда быть правильным. Поскольку strptime не реализована в Windows, есть пользовательская функция

Помните, что returnvalue tm_year – с 1900 года! и tm_month равно 0-11

Если вы хотите, поместите его в временную метку ввода типа MySQL . Вышеописанное работает очень хорошо (только на PHP 5 или новее):

Вот как я это сделаю:

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

Пожалуйста, будьте осторожны в отношении времени / зоны, если вы установите для сохранения дат в базе данных, поскольку у меня возникла проблема, когда я сравнивал даты с mysql, которые были преобразованы в timestamp с использованием strtotime . вы должны использовать точно такое же время / зону перед преобразованием даты в метку времени, иначе strtotime () будет использовать часовой пояс сервера по умолчанию.

Если вы хотите преобразовать 2016-02-14T12:24:48.321Z время UTC ( 2016-02-14T12:24:48.321Z ) в метку времени, вот как вы это сделаете:

How do I get timestamp from e.g. 22-09-2008 ?

19 Answers 19

There is also strptime() which expects exactly one format:

The same with the procedural API:

If the above fails because you are using a unsupported format, you can use

Note that if you do not set the ! , the time portion will be set to current time, which is different from the first four which will use midnight when you omit the time.

Yet another alternative is to use the IntlDateFormatter API:

Unless you are working with localized date strings, the easier choice is likely DateTime.

Be careful with functions like strtotime() that try to "guess" what you mean (it doesn’t guess of course, the rules are here).

Indeed 22-09-2008 will be parsed as 22 September 2008, as it is the only reasonable thing.

How will 08-09-2008 be parsed? Probably 09 August 2008.

What about 2008-09-50 ? Some versions of PHP parse this as 20 October 2008.

So, if you are sure your input is in DD-MM-YYYY format, it’s better to use the solution offered by @Armin Ronacher.

If you have PHP 5.3 or above,

this method works on both Windows and Unix and is time-zone aware, which is probably what you want if you are serious about working with dates.

If you don’t care about timezone, or want to use the time zone your server uses:

1222093324 (This will differ depending on your server time zone. )

If you want to specify in which time zone, here EST. (Same as New York.)

1222093305

Or if you want to use UTC. (Same as "GMT".)

Ссылка на основную публикацию
Adblock detector