Получить текущую дату, учитывая часовой пояс в PHP?

Я хочу получить сегодняшнюю дату с часовым поясом в формате Paul Eggert ( America/New_York ) в PHP?

Сначала установите часовой пояс по умолчанию и затем введите дату, дата будет указана в указанном часовом поясе:

 <?php date_default_timezone_set('America/New_York'); $date= date('md-Y') ; ?> 

http://php.net/manual/en/function.date-default-timezone-set.php

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

Вот короткая версия:

 <?php $date = new DateTime("now", new DateTimeZone('America/New_York') ); echo $date->format('Ymd 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('Ymd 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'); - <?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('Ym-d') . "\n<br>"; echo "---\n<br>"; $oneWeekFromToday = $today->add(new DateInterval('P7D')); $twoWeeksFromToday = $today->add(new DateInterval('P14D')); echo $today->format('Ym-d') . "\n<br>"; echo $oneWeekFromToday->format('Ym-d') . "\n<br>"; echo $twoWeeksFromToday->format('Ym-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('Ym-d') . "\n<br>"; echo "---\n<br>"; $oneWeekFromToday = $today->add(new DateInterval('P7D')); $twoWeeksFromToday = $today->add(new DateInterval('P14D')); echo $today->format('Ym-d') . "\n<br>"; echo $oneWeekFromToday->format('Ym-d') . "\n<br>"; echo $twoWeeksFromToday->format('Ym-d') . "\n<br>"; 

Выход:

 2017-02-11 --- 2017-02-11 2017-02-18 2017-02-25 

В этом втором примере мы получаем даты, которые мы ожидали. Используя DateTimeImmutable вместо DateTime , мы предотвращаем случайные мутации и предотвращаем возможные ошибки.

Если у вас есть доступ к PHP 5.3, расширение int очень приятно для таких вещей.

Вот пример из руководства:

 $fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'America/Los_Angeles',IntlDateFormatter::GREGORIAN ); $fmt->format(0); //0 for current time/date 

В вашем случае вы можете:

 $fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'America/New_York'); $fmt->format($datetime); //where $datetime may be a DateTime object, an integer representing a Unix timestamp value (seconds since epoch, UTC) or an array in the format output by localtime(). 

Поскольку вы можете установить America/New_York пояс, например America/New_York , это намного лучше, чем использование GMT ​​или UTC offset, так как это учитывает также дневные световые периоды.

Окончательно, поскольку расширение intl использует данные ICU, которое содержит много очень полезных функций, когда дело доходит до создания ваших собственных форматов даты и времени.

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

 function convertTimeToLocal($datetime,$timezone='Europe/Dublin') { $given = new DateTime($datetime, new DateTimeZone("UTC")); $given->setTimezone(new DateTimeZone($timezone)); $output = $given->format("Ymd"); //can change as per your requirement return $output; } 
 <?php date_default_timezone_set('GMT-5');//Set New York timezone $today = date("F j, Y") ?>