Я хочу отримати сьогоднішню дату із заданим часовим поясом у форматі Пола Еггерта ( America/New_York
) у PHP?
Я хочу отримати сьогоднішню дату із заданим часовим поясом у форматі Пола Еггерта ( America/New_York
) у PHP?
Відповіді:
Інші відповіді встановлюють часовий пояс для всіх дат у вашій системі. Це не завжди працює добре, якщо ви хочете підтримувати кілька часових поясів для своїх користувачів.
Ось коротка версія:
<?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');
Я впевнений, що існує низка інших бібліотек, але я знайомий із кількома з них.
Поки ви тут, дозвольте мені позбавити вас майбутнього головного болю. Скажімо, ви хочете обчислити 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
, ми запобігаємо випадкові мутації стану та запобігаємо потенційним помилкам.
Спершу встановіть часовий пояс за замовчуванням і отримайте дату, потім дата буде у вказаному часовому поясі:
<?php
date_default_timezone_set('America/New_York');
$date= date('m-d-Y') ;
?>
http://php.net/manual/en/function.date-default-timezone-set.php
date_default_timezone_set()
встановлює його для всього використання date()
після цієї точки. Див. Мою відповідь для прикладу того, як керувати кількома часовими поясами.
Якщо у вас є доступ до 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
, це набагато краще, ніж використання зміщення GMT або UTC, оскільки це враховує також періоди світлового дня.
Нарешті, оскільки розширення intl використовує дані ICU, що містить багато дуже корисних функцій, коли мова йде про створення власних форматів дати / часу.
Я створив просту функцію, яку можна використовувати для перетворення часу в будь-який часовий пояс:
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;
}