为什么strtotime('a')返回时间?

时间:2011-10-27 17:57:05

标签: php

我在PHP 5.3中循环访问CSV文件并检查日期。我一直在使用strtotime(),它运行良好,除了我有一个包含1或2个字符代码的字段。

任何单个字符代码上的 strtotime()似乎就像我要求now(),但如果代码是2个字符,它会失败,正如我所期望的那样。

我不了解strtotime()的工作方式?

5 个答案:

答案 0 :(得分:5)

查看http://www.php.net/manual/en/datetime.formats.time.php时间格式。似乎'a'是一个时区。这可能只是一个'a'有效并且它正在解决其他问题的错误,但至少这是解释。

答案 1 :(得分:2)

strtotime基本上最好解释你的文字意味着什么,我认为你不能依赖它在某些字符串上失败。

示例:

<?php

echo 'Now: ' . date('c') . PHP_EOL;
echo PHP_EOL;
for($c = 'A'; $c <= 'z'; $c = chr(ord($c) + 1)) {
    echo $c . ' - ' . date('c', strtotime($c)) . PHP_EOL;
}

如果我将输出放在http://www.timeanddate.com/library/abbreviations/timezones/military/旁边,我只能支持@tandu的结论,即它将其解释为时区(包括导致无效日期的J字母)。

我猜这是最好的努力。如果您对处理单个字母的方式有疑问,请添加前面的检查。不是很好,但这是你在尝试解析不规则数据时得到的结果。

答案 2 :(得分:0)

echo ((time() - strtotime('a')) / (60 * 60));

这应该等于你当前的时区,因为PHP将“a”解释为TZ。

答案 3 :(得分:0)

好吧,PHP显然在strtotime()中使用单字符时间戳进行SOMETHING:

运行:

<?php

$now = time();
foreach(range('a', 'z') as $char) {
   $t = strtotime($char, $now);
   echo "$now ($char) -> $t {", ($now - $t), "} [", date($char, $now), "]\n";
}

给了我:

1319739230 (a) -> 1319717630 {21600} [pm]
1319739230 (b) -> 1319714030 {25200} [b]
1319739230 (c) -> 1319710430 {28800} [2011-10-27T13:13:50-05:00]
1319739230 (d) -> 1319706830 {32400} [27]
1319739230 (e) -> 1319703230 {36000} [America/Chicago]
1319739230 (f) -> 1319699630 {39600} [f]
1319739230 (g) -> 1319696030 {43200} [1]
1319739230 (h) -> 1319692430 {46800} [01]
1319739230 (i) -> 1319688830 {50400} [13]
1319739230 (j) ->  {1319739230} [27]
1319739230 (k) -> 1319685230 {54000} [k]
1319739230 (l) -> 1319681630 {57600} [Thursday]
1319739230 (m) -> 1319678030 {61200} [10]
1319739230 (n) -> 1319724830 {14400} [10]
1319739230 (o) -> 1319728430 {10800} [2011]
1319739230 (p) -> 1319732030 {7200} [p]
1319739230 (q) -> 1319735630 {3600} [q]
1319739230 (r) -> 1319739230 {0} [Thu, 27 Oct 2011 13:13:50 -0500]
1319739230 (s) -> 1319742830 {-3600} [50]
1319739230 (t) -> 1319746430 {-7200} [31]
1319739230 (u) -> 1319750030 {-10800} [000000]
1319739230 (v) -> 1319753630 {-14400} [v]
1319739230 (w) -> 1319757230 {-18000} [4]
1319739230 (x) -> 1319760830 {-21600} [x]
1319739230 (y) -> 1319764430 {-25200} [11]
1319739230 (z) -> 1319721230 {18000} [299]

非常奇怪,一个角色的'j'完全无法返回某些东西,但其余的则返回SOMETHING。

答案 4 :(得分:0)

我使用各种单个字符进行了测试,它看起来像是由单个字符指定的时区中当前时间的时间戳。 Strtotime(“z”)作为Zulu时间的当前时间戳出来,比我提前四个小时,这是正确的。军事时区没有“J”。