获取当前日期,给定PHP中的时区?


76

我想给定今天的日期,America/New_York在PHP中使用Paul Eggert format()给定时区?


您绝对应该接受DesignerGuy的回答,或将问题的标题更改为“设置默认时区”之类的内容……
Axel

1
@Axel完成,我不再是PHP开发人员,但希望对您有所帮助。
einstein'in

做得好!恕我直言,这是正确的决定……
Axel

Answers:


198

其他答案设置系统中所有日期的时区。如果您想为用户支持多个时区,那么这并不总是很好。

这是简短的版本:

<?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-一个非常流行的日期库。
  • 计时-碳的直接替代品专注于不变性。请参阅下文,了解为什么这很重要。
  • 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(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,我们可以防止意外的状态突变并防止潜在的错误。


感谢@DesignerGuy的答案,但这是受支持的时区的正确列表:php.net/manual/en/timezones.php
Chris Harrison

1
这应该是公认的答案,而这正是我想要的。谢谢!
布雷特(Brett)

有时评论有帮助:)
Axel

54

首先设置默认时区,然后获取日期,该日期将在您指定的时区中:

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

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


11
请注意,usingdate_default_timezone_set()会为以后的所有使用情况设置它date()。请参阅我的答案,以获取有关如何管理多个时区的示例。
安迪·弗莱明

9
如果您只想在该时区获得1个日期,则目前是一种不好的做法,请参见下面的DesignerGuy答案,以获取更加充实的解决方案。
Ward DS

拥有选择时区的一般方法会很好。
Zan 2016年

4

如果您可以访问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数据,在创建自己的日期/时间格式时,它包含许多非常有用的功能。


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

1
<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.