【问题标题】:Rounding PHP timestamp舍入 PHP 时间戳
【发布时间】:2011-08-02 17:44:27
【问题描述】:

将时间戳舍入到小时有什么好的解决方案?

例如,在使用date('d.m.y h:m', time()) 之后,我得到'02.08.11 7:07'...现在,从这里,我想要7:00 的时间戳。

我怎样才能做到这一点?

【问题讨论】:

  • 你是根据现在的时间上下四舍五入还是只想每次都得到 00?
  • 每次只需要 00... 我只需要一个函数来获取输入的任何时间戳的 00 分钟时间戳。
  • 这也是我想知道的。你只是把时间限制在天花板上/地板上,还是你想真正地围绕它们?
  • 你能提供更多的例子吗?时间7:50 应该变成7:00 还是8:00 会发生什么?
  • 没关系,可能是7.00或8.00

标签: php date time


【解决方案1】:

更新

在看到Greg Miller's "Time Programming Fundamentals" talk关于谷歌的cctz C++ library之后,我对我之前的回答很不满意。

处理时间是一个非常复杂的话题(即使不考虑相对论效应)。我们必须尊重 timezones with uneven offsetsdaylight saving timetime jumps due to legislation changesleap seconds 之类的东西,可能还有更多怪癖。 虽然其中许多仅在时间和空间上产生局部影响,但我们程序的用户仍然很不幸会受到影响。

TL;DR

最好依靠像holodoc's answer 这样的底层函数来处理时区管理的怪癖。

旧答案

当我没记错时,时间戳正好从 0:00 1.1.1970 开始,因此将其除以 3600(浮动)然后舍入/地板/天花板并乘以 3600(整数)就足够了。除法必须是浮点数才能使 round/ceil 起作用。

舍入示例:

round($timestamp/3600)*3600
7:20 -> 7:00
7:40 -> 8:00

地板样品:

floor($timestamp/3600)*3600
7:20 -> 7:00
7:40 -> 7:00

天花板示例:

ceil($timestamp/3600)*3600
7:20 -> 8:00
7:40 -> 8:00

【讨论】:

  • +1 聪明的技巧,但它需要了解如何存储时间戳中的时间。我会将这个功能黑箱化(即把它放在一个函数中:)),所以这种智能并不是你需要花费时间的所有地方。
  • 当然这个转换应该只写一次。也可以通过将间隔(捕捉到小时、15 分钟...)传递给函数来使其更通用。
  • 它不工作,你的意思是像:(round($timeHours / 3600) * 3600)?
  • 查找轮中的值。可能是在那里进行整数除法
  • @holodoc “我只需要一个函数来获取输入的任何时间戳的 00 分钟时间戳”对我来说听起来更像是“地板”。问题中给出的示例证实了这一点。您是否实际阅读 OP 要求的内容?此外,逻辑保持不变,您只需将 round 替换为 trunc 或和 int-cast。
【解决方案2】:

有没有想过删除会议记录? :)

echo date('d.m.y h:00', time());

如果您需要开始一分钟的时间戳,只需稍微更改您的 data 参数并使用 strtotime

echo strtotime(date('d.m.Y H:00:00', time()));

【讨论】:

  • 如果时间是 7:32,它需要是 8:00 而不是 7:00。
  • 这不是他/她在原帖的进一步 cmet 中所要求的。
  • 格式化时间戳然后再次解析回时间戳非常麻烦。更好地对时间戳本身进行算术运算。
  • 讨厌与否,当所有必需的函数已经是语言的一部分时,它消除了使用算术的需要。更不用说使用可以轻松更改的日期参数更容易实现请求的进一步更改。
【解决方案3】:

将小时和分钟捕获到 2 个不同的变量中。如果分钟 >= 30,则将小时加一。

不是最优雅的解决方案,但它确实有效。 :)

【讨论】:

    【解决方案4】:

    最简单的解决方案:

    date('d.m.y h', time());
    

    很少看到任何类型的小时被四舍五入的时间戳。如果时间戳显示 7:00 - 这意味着它发生在第 7 个小时,任何时间。如果您开始对时间戳进行四舍五入,人们会将其解释为发生在第 8 小时内的任何时间......这可能会导致混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2018-09-09
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2021-05-07
      相关资源
      最近更新 更多