なぜstrtotime( 'a')は時間を返しますか?

PHP 5.3でCSVファイルをループして日付をチェックしています。私はstrtotime()を使用していますが、それは1つまたは2つのcharコードを含む1つのフィールドを除いてうまくいきました。

任意の単一のcharコードのstrtotime()は私がnow()を求めているように見えますが、コードが2文字の場合は期待通りに失敗します。

strtotime()の仕組みについて理解していないのは何ですか?

4
@マイケル:あなたのPHPのバージョンは何ですか?
追加された 著者 BoltClock,
私はその行動を再現することはできません
追加された 著者 Michael Berkowski,
bool(false)を生成する var_dump(strtotime( 'a'));
追加された 著者 Michael Berkowski,
私がテストした待機中の最初のサーバーはまだ5.1.6を実行します。私の5.3.8マシンは結果を出す
追加された 著者 Michael Berkowski,
@Michael:私のテストシステム(Win7x64/PHP 5.3.4)では、タイムスタンプを生成します。
追加された 著者 Jon,
codepad.org/uJkeLD2W で適切な結果が得られます。
追加された 著者 George Cummins,

5 答え

http://www.php.net/manual/enをご覧ください/datetime.formats.time.php の時刻形式。 「a」はタイムゾーンです。それはちょうど 'a'作品とそれが別のものに解決している間違いかもしれませんが、少なくともそれは説明です。

5
追加された
軍事タイムゾーン。
追加された 著者 nachito,
これは、@ Johan B.W. de Vriesが示した。これは私が期待していたものではありません。
追加された 著者 ursasmar,

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の横に置いた場合/タイムゾーン/ミリタリー/ 、@tanduの結論はタイムゾーン(それは無効な日付になるJ文字を含む)として解釈することをサポートすることができます。

それは最善の努力だと思います。一文字の扱いに問題がある場合は、前にチェックを入れてください。それほど素晴らしいものではありませんが、それは不規則なデータを解析しようとするときに得られるものです。

2
追加された
私は最小文字列の長さのチェックを追加して、今のところ働いています。
追加された 著者 ursasmar,

まあ、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」は何かを返すのに全く失敗しますが、残りは何かを返します。

0
追加された
echo ((time() - strtotime('a'))/(60 * 60));

これは、PHPが "a"をTZとして解釈するので、あなたの現在のタイムゾーンと等しいはずです。

0
追加された

私は様々な単一の文字でテストし、それは単一の文字で指定されたタイムゾーンで現在の時間のタイムスタンプのように見えます。 Strtotime( "z")はZulu時間の現在のタイムスタンプとして現れます。これは私の4時間前です。これは正しいです。軍のタイムゾーンには「J」はありません。

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com