Получить текущую дату, учитывая часовой пояс в PHP? - PullRequest
66 голосов
/ 04 ноября 2011

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

Ответы [ 5 ]

151 голосов
/ 24 июня 2014

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

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

<?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, мы предотвращаем случайные мутации состояния и предотвращаем возможные ошибки.

52 голосов
/ 04 ноября 2011

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

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

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

4 голосов
/ 19 сентября 2017

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

function convertTimeToLocal($datetime,$timezone='Europe/Dublin') {
        $given = new DateTime($datetime, new DateTimeZone("UTC"));
        $given->setTimezone(new DateTimeZone($timezone));
        $output = $given->format("Y-m-d"); //can change as per your requirement
        return $output;
}
4 голосов
/ 04 ноября 2011

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

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

$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, это намного лучше, чем использование смещения по Гринвичу или UTC, поскольку это также учитывает периоды летнего времени.

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

0 голосов
/ 04 ноября 2011
<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...