2014-10-30 118 views
0

我有一个应用程序,用户输入时间/日期,然后通过strtotime()转换成Unix时间戳(用户设置自己的时区)。这通常工作得很好; strtotime甚至设法将诸如2014年3月9日2:15 AM之类的时间转换为时间戳(其对应于如果用户输入“2014年3月9日上午3:15”将返回的时间戳)。PHP strtotime和DST

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

例如,如果用户通过strtotime()通过'2014年11月2日2:15',则结果是与该日期的“second”2:15对应的UNIX时间戳。

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

+1

我建议你使用'DateTime'和'DateTimeZone'类而不是'strtotime()' – Phil 2014-10-30 02:37:55

+0

对不起,这个天真的问题,但我不知道这对用户会有用吗?我意识到我最初的帖子有点不清楚,所以我编辑了它。目前,该应用程序接受来自用户的输入,例如2014年11月2日2:15 AM。有没有一个字符串*用户*(不是编码器,因为我在我的OP中写错了)可以输入来告诉程序*他们打算使用哪个*“2:15”?或者这是我不得不使用DateTime的东西吗?再次,对于混淆抱歉! – user3092995 2014-10-30 02:58:04

+1

这基本上没有解决方案。 11月2日凌晨2点15分有两个。在这段时间里你什么也不做,除非你不介意可能要等一个小时。这就是为什么切换发生在周末深夜,以减少这种情况导致的问题最小化。在我意识到的现实世界的任何地方都没有官方的解决方案。 – deceze 2014-10-30 03:08:53

回答

0

您可以包含一个时区偏移或缩写以及要解析的字符串,并且它通常会选择正确的时间戳。

例如,假设你已在美国东部时区("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”的解释,有些更糟糕,比如5种不同的“CST”的解释。一般来说,依靠输入的时区缩写是不好的。坚持抵消,你会没事的。

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

您可能也有兴趣this question, and it's answer,它可以帮助您确定您的输入时间是无效的或模糊的。然后,您可以相应地提示用户,并且(在含糊的情况下)要求他们在两种可能的偏移之一中进行选择。