得到当前date,在PHP中给出一个时区?
我想在PHP中使用Paul Eggert格式( America/New_York
)获得今天的date。
先设置默认时区,然后获取date,date将在您指定的时区中:
<?php date_default_timezone_set('America/New_York'); $date= date('md-Y') ; ?>
http://php.net/manual/en/function.date-default-timezone-set.php
其他答案设置系统中所有date的时区。 如果您想为用户支持多个时区,这并不总是奏效。
这是简短的版本:
<?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');
图书馆
- 碳 – 一个非常受欢迎的date库。
- Chronos – Carbon的替代产品专注于不变性。 看下面为什么这很重要。
- jenssegers / date – Carbon的扩展,增加了多语言支持。
我相信还有其他一些库,但是这些是我熟悉的。
奖金课:不变的date对象
当你在这里的时候,让我来救你一些未来的头痛。 假设你想从今天开始计算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
嗯…这不是我们想要的。 在PHP中修改传统的DateTime
对象不仅会返回更新的date,还会修改原始对象。
这是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
在第二个例子中,我们得到了我们预期的date。 通过使用DateTimeImmutable
而不是DateTime
,我们可以防止意外的状态变化并防止潜在的错误。
如果您有权访问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数据,在创build自己的date/时间格式时,它包含许多非常有用的function。
我已经创build了一些简单的函数,可以用来将时间转换为任何时区:
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") ?>