其他答案设置系统中所有日期的时区。如果您想为用户支持多个时区,那么这并不总是很好。
这是简短的版本:
<?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 = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT');
echo $date->format('l, F j Y g:i:s A');
echo "\n<br />\n";
$usersTimezone = 'America/New_York';
$tz = new DateTimeZone($usersTimezone);
$date->setTimeZone($tz);
echo $date->format('l, F j Y g:i:s A');
图书馆
我确定还有许多其他可用的库,但是我很熟悉。
奖励课程:不可变的日期对象
当您在这里时,让我为您免除以后的麻烦。假设您要计算今天的1周和今天的2周。您可能会编写一些代码,例如:
<?php
$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
,我们可以防止意外的状态突变并防止潜在的错误。