得到当前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") ?>