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

  • 本文关键字:返回 时间 strtotime php
  • 更新时间 :
  • 英文 :


我正在PHP 5.3中循环浏览一个CSV文件并检查日期。我一直在使用strtotime((,它运行得很好,只是有一个字段包含1或2个字符的代码。

任何单个字符代码上的strtotime((看起来就像我在请求now((,但如果代码是2个字符,它就会失败,正如我所期望的那样

关于strtotime((的工作方式,我有什么不了解的?

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

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字母(。

我想这是最大的努力。如果你对它处理单个字母的方式有问题,请在前面加一张支票。虽然不是很好,但当你试图解析不规则的数据时,你会得到这样的结果。

很明显,PHP在strtotime((:中使用单个字符时间戳做了一些事情

运行:

<?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"完全没有返回一些东西,但其余的都返回了一些东西。

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

这应该等于您当前的时区,因为PHP将"a"解释为TZ.

我用各种单个字符进行了测试,它看起来像是单个字符指定的时区中当前时间的时间戳。Strtotime("z"(是祖鲁时间的当前时间戳,比我提前了四个小时,这是正确的。军事时区没有"J"。

最新更新