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


Get current date, given a timezone in PHP?

我想得到今天的日期给定一个时区在Paul Eggert格式(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');

<标题>库h1> li>Carbon -一个非常流行的日期库。
  • Chronos -碳的替代品,专注于不变性。为什么这很重要,见下文。
  • 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
    

    哦…这不是我们想要的。在PHP中修改传统的DateTime对象不仅会返回更新后的日期,还会修改原始对象。

    这就是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

    我已经创建了一些简单的函数,可以用来将时间转换为任何时区:

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

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

    <?php
    date_default_timezone_set('GMT-5');//Set New York timezone
    $today = date("F j, Y")
    ?>