Другие ответы устанавливают часовой пояс для всех дат в вашей системе. Это не всегда хорошо работает, если вы хотите поддерживать несколько часовых поясов для своих пользователей.
Вот короткая версия:
<?php
$date = new DateTime("now", new DateTimeZone('America/New_York') );
echo $date->format('Y-m-d H:i:s');
Работает в PHP> = 5.2.0
Список поддерживаемых часовых поясов: php.net / manual / en / timezones.php
Вот версия с существующим временем и настройкой часового пояса с помощью пользовательской настройки
<?php
$usersTimezone = 'America/New_York';
$date = new DateTime( 'Thu, 31 Mar 2011 02:05:59 GMT', new DateTimeZone($usersTimezone) );
echo $date->format('Y-m-d H:i:s');
Вот более подробная версия, чтобы показать процесс немного более наглядно
<?php
// Date for a specific date/time:
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT');
// Output date (as-is)
echo $date->format('l, F j Y g:i:s A');
// Output line break (for testing)
echo "\n<br />\n";
// Example user timezone (to show it can be used dynamically)
$usersTimezone = 'America/New_York';
// Convert timezone
$tz = new DateTimeZone($usersTimezone);
$date->setTimeZone($tz);
// Output date after
echo $date->format('l, F j Y g:i:s A');
Библиотека
- Carbon - очень популярная библиотека дат.
- Chronos - вставная замена для Carbon, ориентированная на неизменность. Смотрите ниже, почему это важно.
- jenssegers / date - Расширение Carbon, которое добавляет поддержку нескольких языков.
Я уверен, что есть ряд других доступных библиотек, но это те, с которыми я знаком.
Бонусный урок: неизменяемая дата Объекты
Пока вы здесь, позвольте мне избавить вас от головной боли в будущем. Допустим, вы хотите рассчитать 1 неделю с сегодняшнего дня и 2 недели с сегодняшнего дня. Вы могли бы написать такой код как:
<?php
// Create a datetime (now, in this case 2017-Feb-11)
$today = new DateTime();
echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";
$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));
echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
echo "\n<br>";
Выход:
2017-02-11
---
2017-03-04
2017-03-04
2017-03-04
Хмммм ... Это не совсем то, что мы хотели. Изменение традиционного объекта DateTime
в PHP не только возвращает обновленную дату, но также изменяет исходный объект.
Здесь DateTimeImmutable
входит.
$today = new DateTimeImmutable();
echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";
$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));
echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
Выход:
2017-02-11
---
2017-02-11
2017-02-18
2017-02-25
Во втором примере мы возвращаем ожидаемые даты. Используя DateTimeImmutable
вместо DateTime
, мы предотвращаем случайные мутации состояния и предотвращаем возможные ошибки.