【问题标题】:PHP strtotime and DSTPHP strtotime 和 DST
【发布时间】:2014-12-25 23:14:12
【问题描述】:

我有一个应用程序,用户输入时间/日期,然后通过 strtotime() 转换为 Unix 时间戳(用户设置自己的时区)。这通常效果很好; strtotime() 甚至设法将诸如 2014 年 3 月 9 日凌晨 2:15 的时间转换为时间戳(与用户输入“2014 年 3 月 9 日凌晨 3:15”时返回的时间戳相对应)。

但是,假设用户想要输入 2014 年 11 月 2 日上午的时间 - 具体来说,在 2:00 到 3:00 之间。是否有用户可以添加的元素来指定将使用哪个时间?

例如,如果用户通过 strtotime() 传递“2014 年 11 月 2 日上午 2:15”,则结果是对应于该日期“秒”2:15 的 UNIX 时间戳。

如何指定“第一个”2:15?

【问题讨论】:

  • 我建议你使用DateTimeDateTimeZone 类而不是strtotime()
  • 抱歉这个幼稚的问题,但我不确定这对用户有什么用处?我意识到我最初的帖子有些不清楚,所以我编辑了它。目前,该应用程序接受来自用户的输入,例如“2014 年 11 月 2 日凌晨 2:15”。 user(不是编码器,因为我在我的 OP 中错误地写了)可以输入一个字符串来告诉程序 which 他们想要“2:15”吗?或者这是我必须使用 DateTime 的东西吗?再次抱歉,造成混乱!
  • 这个基本没有解决办法。 11 月 2 日只有两个凌晨 2 点 15 分。在那段时间里你根本不做任何事情,除非你不介意可能不得不等待一个小时。这就是为什么在周末的半夜进行切换以将由此导致的问题降至最低的原因。我所知道的现实世界中的任何地方都没有官方的解决方案来解决这种歧义。
  • @deceze 什么 FUD。仅仅因为不知道解决方案并不意味着不存在。
  • @Matt 您的解决方案是使用时区?好吧,当然,如果你有足够的信息来解决这个问题,你总是可以通过这样做来增加或减少一个小时。这仍然意味着在一个时区内,有 两个 凌晨 2:15,并且没有官方符号可以消除这两个的歧义。

标签: php strtotime dst


【解决方案1】:

您可以在要解析的字符串中包含时区偏移量或缩写,它通常会选择正确的时间戳。

例如,假设您使用的是美国东部时区("America/New_York"),您可以包含这样的偏移量:

strtotime('2:15 AM November 2, 2014 -0400')  // 1414908900
strtotime('2:15 AM November 2, 2014 -0500')  // 1414912500

或缩写:

strtotime('2:15 AM November 2, 2014 EDT')  // 1414908900
strtotime('2:15 AM November 2, 2014 EST')  // 1414912500

现在我说 “通常” 的原因是因为时区缩写可能不明确。检查Wikipedia's list of time zone abbreviations,“EST”有两种不同的解释。有些更糟糕,例如对“CST”的 5 种不同解释。一般来说,input 依赖时区缩写是不好的。坚持使用偏移量,你会没事的。

当然,您仍然需要知道哪些偏移量适用于哪些时区。在 PHP 中,您可以使用 timezone_offset_get

您可能还对this question, and it's answer 感兴趣,它可以帮助您确定您输入的时间是否无效或不明确。然后,您可以相应地提示用户,并(在模棱两可的情况下)要求他们在两个可能的偏移量之一之间进行选择。

【讨论】:

    猜你喜欢
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2016-04-05
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多