0

在我的“工具箱”中,我正在使用这个功能:

function dataAttuale() {
    $now                    = new DateTime();
    $dataAttuale            = $now->format(DateTime::ISO8601);
    $offset                 = $now->getOffset();
    date_default_timezone_set('UTC');
    $nowUTC             = new DateTime();
    $dataUTC                = $nowUTC->format(DateTime::ISO8601);
    $orario             = array();
    $orario['dataAttuale']  = $dataAttuale;
    $orario['dataUTC']      = $dataUTC;
    $orario['offset']       = $offset;
    return $orario;
}

我得到这个数组

Array
(
    [dataAttuale] => 2013-10-18T11:03:52+0200
    [dataUTC] => 2013-10-18T09:03:52+0000
    [offset] => 7200
)

所以我可以在一个日期时间 MySql 字段中保存一个引用 UTC 的日期时间。

现在,我对此有些麻烦。

1)我也会保存偏移量(以秒为单位)。什么是最好的 Mysql 字段?我认为最大秒数可以是 +14hour * 60 * 60 = 50400 和 -12hours*60*60 = -43200

2)你认为显着保存还抵消?即,例如,几个 API 服务以 UTC + 偏移量返回日期......

非常感谢!

更新:

谢谢你们俩。现在我以 UTC 格式和 varchar 时区保存 MySQL 日期时间。通过一些代码,我得到了我想要的:

$orario = new DateTime($value['creazione'], new DateTimeZone($value['timezone']));
$orario     = $orario->format(DateTime::ISO8601);

输出是(对于欧洲/罗马)

2013-10-19T09:27:54+0200

对于美国/蒙特利尔

2013-10-19T09:29:16-0400

对于澳大利亚/墨尔本

2013-10-19T09:30:31+1100

(分钟//秒的差异是在我的 PHP 脚本中更改默认时区的时间)。

现在我认为:

1)我可以嘲笑 Y2038 错误,放弃(叹息:()时间戳:(

2)我可以安全地环游世界并使用我自己的日历(naaaa ...我将永远使用谷歌日历,当然)

4

2 回答 2

1

保存偏移量没有多大意义。您可以对时间戳感兴趣的两个可能值:

  1. 一般的全球时间戳,例如“世界上的时间点,它是世界标准时间 2013 年 9 月 6 日凌晨 12:52”
  2. 某个时间点的具体当地时间,例如“17:34 on Dec. 19th 2012 in Manila, Philippines”

请注意,这两者实际上是同一件事,它们以挂钟时间和日期的符号表示特定位置或时区的时间点。唯一的区别是 UTC 是一个指定的标准“位置”,相对于它表示其他时区偏移量;但没有理由不能将菲律宾的马尼拉用于同样的目的。

因此,当您想要存储绝对时间戳时,您可以:

  1. 决定您的所有时间都存储在特定时区(如 UTC)中,并简单地存储该时间戳
  2. 确定您对特定本地时间感兴趣并存储时间戳及其时区

无论哪种方式,您都需要时间戳,并且您需要知道它所在的时区。1.您提前决定所有时间戳都在同一个定义的时区中并且不需要存储它,2.您明确保存该时区信息.

偏移量不是存储的好东西,因为它全年变化。夏季的偏移量可能是 UTC 的 +6 小时,但冬季可能是 +7。如果您稍后需要在本地化时间进行日期计算,则偏移量会产生误导并且对您没有多大帮助。如果您知道您正在谈论的时区,您可以在一年中的任何时间获得偏移量。

MySQL 不支持 DATETIME + TIMEZONE 字段(例如 Postgres 支持),因此您需要将时区(例如“Europe/Berlin”)存储在单独的文本字段中。如果您根本不需要将时间戳与特定位置相关联,则不需要时区,您只需要存储标准化时间戳,例如标准化为 UTC。

于 2013-10-18T09:34:24.747 回答
1

MySQL 是时区奖励(它不会将时区与日期一起存储,但会将其转换为规范化格式),因此大多数情况下您不需要额外的带有偏移量的字段。

您只需要确保time_zone为您的连接设置正确。

因此,如果您有一个日期并且想要将其存储在您的数据库中,那么您有不同的可能性:

  1. 您可以使用SET time_zone = timezone;您的连接。您告诉 MySQL 您从 MySQL 发送或接收的日期应该在 give 中的方式timezone。MySQL 将在内部将其转换为规范化格式。

  2. 如果你想插入具有不同时区的日期,time_zone那么你可以使用CONVERT_TZ(dt,from_tz,to_tz). from_tz是您的日期的时区to_tz,即为您的连接设置的时区。

在某些情况下时区可能很重要。如果您的情况确实如此,那么您的问题并不完全清楚。

于 2013-10-18T09:29:58.310 回答