Neden strtotime ('a') bir zaman döndürüyor?

PHP 5.3'te bir CSV dosyasından geçiyorum ve tarihleri ​​kontrol ediyorum. Strtotime() kullanıyorum ve 1 veya 2 karakter kodu içeren bir alan dışında iyi çalıştı.

Herhangi bir tek kod üzerinde strtotime() şimdi() için soruyorum gibi davranıyor gibi görünüyor, ancak kod 2 karakter varsa, bunu beklerim gibi, başarısız olur.

Strtotime() yönteminin işleyiş şekli hakkında ne anlamadım?

4
@Michael: PHP'nin sürümü nedir?
katma yazar BoltClock, kaynak
Bu davranışı yeniden oluşturamıyorum
katma yazar Michael Berkowski, kaynak
var_dump (strtotime ('a')); bool (false) üretiyor
katma yazar Michael Berkowski, kaynak
Bekle - karşı test ettiğim ilk sunucu hala çalışıyor. 5.1.6. 5.3.8 makinem sonuç üretiyor
katma yazar Michael Berkowski, kaynak
@Michael: Test sistemimde (Win7x64/PHP 5.3.4) bir zaman damgası üretir.
katma yazar Jon, kaynak
codepad.org/uJkeLD2W uygun sonuçlar üretir.
katma yazar George Cummins, kaynak

5 cevap

http://www.php.net/manual/en adresine bakın. /datetime.formats.time.php zaman biçimleri. Görünüşe göre 'a' bir saat dilimi. Bu sadece bir 'bir' çalışmanın ve başka bir şeye çözümlenmesinin bir hatası olabilir, ama en azından açıklama budur.

5
katma
katma yazar nachito, kaynak
Bu, John B.W. de Vries gösterdi. Bu benim beklediğim şey değil.
katma yazar ursasmar, kaynak

strtotime temel olarak metnin ne anlama geldiğini yorumlamak için elinden geleni yapar, bazı dizelerde başarısız olmasına güvenemeyeceğinizi düşünmüyorum.

Örnek:

<?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;
}

Çıktıyı http://www.timeanddate.com/library/abbreviations adresinin yanına koyarsam/timezones/military/, sadece @tandu 'nun zaman dilimi olarak yorumladığını (geçersiz bir tarihle sonuçlanan J harfi dahil) destekleyebilirim.

Bu en iyi çaba, sanırım. Tek harflerle ilgilenme biçiminde bir sorun yaşıyorsanız, bir kontrol ön ekleyin. Gerçekten hoş değil, ama düzensiz veriyi ayrıştırmaya çalıştığınızda böyle oluyor.

2
katma
Minimum dize uzunluğu için bir kontrol ekledim ve şu an için çalışıyor.
katma yazar ursasmar, kaynak

Eh, PHP açıkça SOMETHING strtotime() tek char zaman damgaları ile yapıyor:

Koşu:

<?php

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

bana verir:

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]

Bir karakter için 'j', bir şeyi geri vermek için tamamen başarısız olur, ancak geri kalanı SOMETHING'e geri döner.

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

Bu, PHP'nin "a" yi TZ olarak yorumladığından geçerli saat diliminize eşit olmalıdır.

0
katma

Çeşitli tek karakterlerle test ettim ve tek karakter tarafından belirlenen saat diliminde geçerli zaman için bir zaman damgası gibi görünüyor. Strtotime ("z"), Zulu zaman için geçerli bir zaman damgası olarak çıkıyor, dört saat ileride, ki bu doğru. Askeri saat dilimleri için "J" yok.

0
katma