8

私はこれを理解できません - なぜ次のことが起こるのですか?

echo date("d-m-Y", strtotime($str));

$str = '214454';  // Produces todays date
$str = '333333';  // Produces 1-1-1970
$str = 'a' (or ANY single char)  // Produces tomorrows date
$str = 'aa' (or ANY double char)  // Produces 1-1-1970

または strtotime 関数を返すだけ

echo strtotime($str);

$str = '214454';  // Produces todays date
$str = '333333';  // returns false
$str = 'a' (or ANY single char)  // Produces tomorrows date
$str = 'aa' (or ANY double char)  // returns false

これらの値は、特定の関数から特定の値がどのように/なぜ返されているかを調べるために、私が行っていたいくつかのテストから得られました。

「a」(または任意の単一の文字)が間違った誤った日付として返されると想定するため、関数が失敗します。

4

2 に答える 2

7

1文字と2文字の両方がタイムゾーンとして解釈されます(表「使用済み記号」、行「tz」)。6桁は次のように解釈されHHMMIIます(表「24時間表記」、行「時、分、秒、コロンなし」)。

有効な形式

1番目と3番目のケースでは、解析が成功し、strtotimeタイムスタンプを返し、date対応する日付を出力します。最初のケースが成功する理由は明らかです。3番目のケースでは、軍のタイムゾーンを1文字で参照できることを覚えておいてください。そうすれば、結果は理にかなっています。このコードに従ってみましょう:

$zones = range('a', 'z');
$last = null;

foreach($zones as $tz) {
    $ts = strtotime($tz);
    if ($last !== null) {
        echo "TZ $last[0] => TZ $tz: change = ".($ts - $last[1])."\n";
    }
    $last = array($tz, $ts);
}

このプリント

TZ a => TZ b: change = -3600
TZ b => TZ c: change = -3600
TZ c => TZ d: change = -3600
TZ d => TZ e: change = -3600
TZ e => TZ f: change = -3600
TZ f => TZ g: change = -3600
TZ g => TZ h: change = -3600
TZ h => TZ i: change = -3600
TZ i => TZ j: change = -1346649725
TZ j => TZ k: change = 1346646125
TZ k => TZ l: change = -3600
TZ l => TZ m: change = -3600
TZ m => TZ n: change = 46800
TZ n => TZ o: change = 3600
TZ o => TZ p: change = 3600
TZ p => TZ q: change = 3600
TZ q => TZ r: change = 3600
TZ r => TZ s: change = 3600
TZ s => TZ t: change = 3600
TZ t => TZ u: change = 3600
TZ u => TZ v: change = 3600
TZ v => TZ w: change = 3600
TZ w => TZ x: change = 3600
TZ x => TZ y: change = 3600
TZ y => TZ z: change = -43200

あるタイムゾーンから次のタイムゾーンに移動するときの連続性を確認できます。'j'存在しないタイムゾーンの不連続性(ここでは、以下で説明するのと同じ結果で解析が失敗します)。'n'UTC+12からUTC-1に移動するタイムゾーンでの不連続性など。

無効な形式

2番目と4番目のケースでは、解析が失敗してstrtotime戻りfalse、これは呼び出した場合と同じ効果がありdate("d-m-Y", 0)ます。つまり、エポックの開始(1970年1月1日00:00:00)をフォーマットします。これは、通常の型ジャグリング規則に従ってfalse整数に変換されるために発生します。0

strtotime('x')本当に何が戻ってきますか?

UTC-11のタイムゾーンで現在の時刻を返します(これは「X線」軍事タイムゾーンです)。現地の時間とタイムゾーンに応じて、これは通常、あなたの観点からは「今日」または「明日」のいずれかです。たまたまUTC-11未満の場合は、「昨日」である可能性もあります(ただし、そうなる可能性はほとんどありません)。

于 2012-09-03T13:11:23.650 に答える
3
  • 214454 は時:分:秒として扱われます
  • 333333 33時間ないから
于 2012-09-03T13:05:07.987 に答える