【问题标题】:Converting from UTC in PHP using a variable timezome使用可变时区从 PHP 中的 UTC 转换
【发布时间】:2011-08-12 01:08:28
【问题描述】:

我使用 SQL 中的简单时间戳将时间戳存储在我的服务器上。当我拉下该时间戳时,我通过以下函数运行它以格式化时间。

如何添加以下函数以将 $timestamp 转换为用户查询的时区?

// Returns the formatted time
function displayDate($timestamp)
{
    $secAgo = time() - $timestamp;
    // 1 day
    if ($secAgo < 86400)
        return date('h:i:A', $timestamp);
    // 1 week
    if ($secAgo < (86400 * 7))
       return date('l', $timestamp);
    // older than 1 week
    return date('m/t/y', $timestamp);
}

【问题讨论】:

    标签: php mysql time


    【解决方案1】:

    如果您要更改时区名称,您可以使用以下内容:

    $date = new DateTime(date('Y-m-d H:i:s', $timestamp), new DateTimeZone('UTC'));
    $date->setTimezone(new DateTimeZone('Asia/Vladivostok'));
    return $date->format('m/t/y');
    

    其中Asia/Vladivostok 是用户的自定义时区。

    【讨论】:

    • @Walker:没有。您必须从 javascript 传递它(例如使用 ajax)或尝试使用用户的 IP 猜测 TZ(更糟糕的解决方案)。
    • 猜测是危险的;而是提示用户。 It's pretty easy to do this,在 Date.getTimezoneOffset 的帮助下缩小可能的猜测范围。
    • 您如何看待将 timezoneOffset(以秒为单位)从 javascript 传递到 PHP 然后使用它?这是一个可行的选择吗?
    【解决方案2】:

    @zerkms 的方法是将时间戳转换为任何时区的最佳方法。

    但是,如果您每次需要显示时间时都这样做,则可能会对性能产生重大影响,因为您每次都在设置和拆除时区对象。如果页面上的所有时间戳都在同一个时区,那么有一个方便的快捷方式。 (通常是这种情况,因为用户不会在 HTTP 请求中间更改时区。)

    在函数之外的某个地方,做:

    date_default_timezone_set('America/New_York');  // or any other timezone
    

    将它与您的会话管理功能联系起来可能是个好主意,这样同一个用户总是得到同一个时区。

    一旦你这样做了,date() 将自动开始使用正确的时区,假设$timestamp 代表一个 Unix 时间戳。它还将自动更正夏令时。因此,无需更改该函数中的任何内容。

    使用timezone_identifiers_list() 检索有效时区列表。

    【讨论】:

    • 我不会说它会导致显着的性能问题(因为在我的慢速办公室 PC 上 10k 实例化花费了大约 0.02 秒),但它确实使代码更加清晰和更受支持。
    • @zerkms 嗯,我上次尝试设置几百个时区对象(每个可用时区一个)时,在慢速 VM 上花费了相当明显的几分之一秒。一遍又一遍地重复使用同一个时区可能会更快?
    • 可能是。另请注意,我在 apache 下的 windows 上进行了测试,这比在 linux 上慢得多。
    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 2020-06-16
    • 2020-06-12
    • 2011-09-16
    • 2019-11-23
    • 2018-09-03
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多