【问题标题】:PHP to output a local timezone adjusted DateTimePHP 输出一个本地时区调整的 DateTime
【发布时间】:2011-06-07 12:29:01
【问题描述】:

我的印象是 PHP DateTime 类的 format() 函数导出了它最初传递的时间戳,并应用了正确的偏移量。

我开始意识到这样做是没有意义的。因此,我想将数据库中的时间戳 (UTC) 与用户的时区一起存储在对象中,并能够根据我想要 UTC 日期还是用户时区调整日期来输出它。

我已经开始扩展 DateTime 类来执行此操作,但我想知道我是否在 DateTime 中的现有方法或 DateTime 类以它的方式工作背后的思考过程中遗漏了什么。

大概我还需要几个静态工厂方法,它们可以获取时间戳、时区以及传入的时间戳是用户调整的时间戳还是 UTC 时间戳,并且能够进行必要的调整以实例化标准化来自传入时间的 UTC 版本的 DateTime 对象。通过这种方式,我可以在 UI 和数据库周围放置时间戳,并能够在它们之间进行适当的转换。

有没有更简单的方法?我见过 date_default_timezone_set 函数,但我想避免该设置影响整个脚本,导致用户调整的时间存储在数据库中。

(我将用户的时区作为时区字符串存储在数据库中,例如 Europe/Berlin,以便从用户会话变量传递给函数。我还打算将所有日期时间存储为 UTC 时间和将服务器的 php.ini 也设置为 UTC。)

【问题讨论】:

    标签: php timezone


    【解决方案1】:

    您可以创建DateTime 实例,指定它是UTC。然后将其时区更改为 setTimeZone() 用户的时区。

    $datetime = new DateTime("2011-06-07 12:34:56", new DateTimeZone("UTC"));
    $datetime->setTimeZone(new DateTimeZone("Europe/Berlin"));
    echo $datetime->format(DateTime::RSS);
    

    【讨论】:

    • 啊,这就是我所缺少的。使用起始时区对其进行初始化,然后将其设置为使用结束时区。
    • 当然,这通常真的很简单,但却是一个很常见的问题。
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2014-02-10
    • 2010-10-01
    • 1970-01-01
    • 2012-01-09
    • 2011-04-22
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多