【问题标题】:Basic PHP timezones conversion基本的 PHP 时区转换
【发布时间】:2010-11-16 17:08:26
【问题描述】:

我查看了以前的问题,但似乎没有什么符合我的要求。

我正在开发一个调度系统,现在客户想要添加时区。

所以基本上我需要能够在特定的日期和时间执行操作。

假设有人选择在以下日期/时间发出警报:

25-12-2010 13:01:00 + / - 他们的时区

我需要能够将它作为 unix_timestamp 存储在 mysql 中,我一直在查看 PHP 的 DateTime 和 DateTimeZone 但这让我更加困惑。

我也看过strtotime,我只是不确定用偏移量计算日期/时间的最佳方法。

【问题讨论】:

  • @Kyle Hudson - 仅将时间存储在您的执行服务器时区中,并用一列说明您的客户端时区与您的执行服务器时区之间的差异,例如您的客户端时区更快比你的执行服务器多3600秒,所以存储-3600,总结一下
  • 为什么不能使用 DateTime 或 Timestamp 列?另外,请参阅此处以获取 example on using DateTime and DateTimezone
  • @Gordon +1,@ajreal:不会是 +3600 吗?
  • @Kyle Hudson - 顺序相反,如果您的执行服务器速度较慢,您需要对 -3600 求和,以便您的脚本可以提前一小时运行,反之亦然
  • @ajreal:你是什么意思?通过执行服务器?它是一个每分钟运行一次的 cron。服务器是 Europe/London 1926(在撰写本文时)

标签: php datetime strtotime datetimeoffset


【解决方案1】:

为了确保我们在同一页面上,我只想重申,unix 时间戳只是自“Unix 纪元”(1970 年 1 月 1 日)以来的秒数。因此,简单的数学运算将适用于 unix 时间戳。

有两种方法可以解决这个问题;从您的帖子来看,您对要使用哪个感到困惑。

第一种方法是最简单(也是最合乎逻辑)的方法,即存储它们的偏移量(如果你已经有了它,那就是)并将其乘以 3600(1 小时以秒为单位),然后添加 那个值到当前的unix时间戳以获得它们的最终运行时间。

另一种方法是使用DateTimeDateTimeZone 类。这两个类是如何工作的,如here 所示,是您创建了两个DateTimeZone 对象,一个带有您的时区,一个带有他们的时区;创建两个DateTime 对象,第一个参数是"now",第二个是对上面DateTimeZone 对象的引用(分别);然后在你的时区对象上调用getOffset方法,将他们的时区对象作为第一个参数,最终以秒为单位获得可以添加到当前unix的偏移量时间戳以获取他们的作业需要运行的时间。

如果我自己这么说,对于如此简单的任务,第二种方法似乎要复杂得多,所以第一种解决方案可能更适合您的需求。但是,如果您希望有一个更完整的方法,那么使用DateTimeDateTimeZone 肯定是可能的。

关于 strtotime 的快速说明:Strtotime 是 date() 命令的一个简单反义词,它只是实现您正在寻找的“工具”而已。它本身不会为您转换或找到偏移量;它只是将格式化的日期和时间转换为 unix 时间戳。

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2013-12-20
    • 1970-01-01
    • 2017-06-03
    • 2011-12-15
    • 2020-03-05
    • 2013-08-06
    相关资源
    最近更新 更多