Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Здесь короткая версия:

<?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(new DateInterval('P7D'));
$twoWeeksFromToday = $today->add(new DateInterval('P14D'));

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(new DateInterval('P7D'));
$twoWeeksFromToday = $today->add(new DateInterval('P14D'));

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

Ответ 3

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

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

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

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

Ответ 4

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

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;
}

Ответ 5

<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>