【问题标题】:Get current date, given a timezone in PHP?获取当前日期,给定 PHP 中的时区?
【发布时间】:2011-12-21 20:15:37
【问题描述】:

我想在 PHP 中以 Paul Eggert 格式 (America/New_York) 的时区获取今天的日期?

【问题讨论】:

  • 您绝对应该接受DesignerGuy's answer 或将您的问题标题更改为“设置默认时区”...
  • @Axel 完成,我不再是 PHP 开发人员了,但我希望它有所帮助。
  • 干得好!恕我直言,这是正确的决定......

标签: php date timezone


【解决方案1】:

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

这是简短的版本:

<?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 — 一个非常受欢迎的日期库。
  • Chronos — 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

嗯...这不是我们想要的。在 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,我们可以防止意外的状态突变并防止潜在的错误。

【讨论】:

  • 感谢@DesignerGuy 的回答,但这里有一个正确支持的时区列表:php.net/manual/en/timezones.php
  • 这应该是公认的答案,正是我想要的。谢谢!
  • 有时评论会有所帮助:)
【解决方案2】:

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

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

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

【讨论】:

  • 请注意,使用date_default_timezone_set() 会将其设置为在那之后所有date() 的使用。有关如何管理多个时区的示例,请参阅我的答案。
  • 如果您只想在该时区获得 1 个日期,目前是不好的做法,请参阅下面 DesignerGuy 的答案以获得更充实的解决方案。
  • 如果有选择时区的通用方法会很好。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    如果您可以访问 PHP 5.3,intl extension 非常适合执行此类操作。

    这是手册中的一个示例:

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

    【讨论】:

      【解决方案5】:
      <?php
      date_default_timezone_set('GMT-5');//Set New York timezone
      $today = date("F j, Y")
      ?>
      

      【讨论】:

        猜你喜欢
        • 2016-09-27
        • 2014-09-08
        • 2020-05-30
        • 2013-04-18
        • 2011-09-14
        • 2014-12-30
        • 2021-12-16
        • 1970-01-01
        相关资源
        最近更新 更多