【问题标题】:Timezone calculations. PHP function vs MySQL Function时区计算。 PHP 函数与 MySQL 函数
【发布时间】:2012-04-24 18:17:42
【问题描述】:

我正在使用 php 开发一个 API,我只是将查询结果作为 JSON 字符串发送出去。结果是多个表的组合。然而,其中一个领域是时间。我需要根据不同表中的时区设置将其转换为不同的时区。

这是当前的输出:

     Array ( "Show_name" => "Billards",
             "Show_type" => "Movie",
             "Start_Time" => "2011-11-09 07:00:00",
             "End_Time" => "2011-11-09 09:00:00",
             "Open" => "Yes"
           );

默认情况下,所有记录的开始时间和结束时间都是 EST。时区设置存储在具有 Timezone_ID、GMT_offset、DST_offset 字段的不同表中。根据这些默认设置的 start_time 和 end_time,应将其转换为各自的时区。

我最初计划编写一个 MySQL 函数来从查询本身计算这个权利,这样 JSON 格式/字段就不会改变。但我看到,与 PHP 函数相比,它的速度太慢了。

根据您的经验,您有什么建议? - 有没有办法在查询中简单地计算? - MySQL 函数的性能是否优于 PHP? - 如果我需要使用 php 函数,我需要遍历所有记录来计算这个。不确定我是否需要单独提取时区记录。因为我不想更改 JSON 响应中的格式/字段数。

还有其他更好的方法吗?

【问题讨论】:

  • 如果您将所有时间以 UTC 或 UTC 时间戳存储在数据库中,那么当您必须将其调整到不同的时区时,生活会变得更加轻松。在 EST 中,您必须在将其转换为所需时区之前考虑 EST 偏移量和 DST。不过,做出这种改变可能为时已晚。
  • @drew010,是的,此时我无法更改数据库架构 :-(
  • 你看过CONVERT_TZ()吗?

标签: php mysql function timezone


【解决方案1】:

我通常在数据库端执行此操作。请注意,我将数据库中的所有日期都存储为 UTC。

所以,要在用户的本地时区向用户显示数据,我会这样做:

SELECT Show_name, Show_type,
  Start_time, CONVERT_TZ(Start_time, 'UTC', 'EST') AS Start_time_local
FROM Shows

“EST”是用户在其偏好中选择的时区。

将数据库中的日期从 EST 更改为 UTC 不需要任何架构更改,因为时区未存储在架构中。

要将所有日期从 EST 转换为 UTC,只需执行以下操作:

UPDATE Shows
SET Start_time = CONVERT_TZ(Start_time, 'EST', 'UTC')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 2021-03-21
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    相关资源
    最近更新 更多