PHP zaman matematik garip davranış: Neden strtotime () negatif sayılar dönüyor?

5 Cevap

Ben bazı çok temel zaman matematik yapmak için çalışıyorum - temelde, hızını hesaplamak, zaman ve mesafe girişleri verilmiştir. Ben saniye içine zaman girdi dönüştürmek strtotime () kullanmayı seçti - ama bazı tuhaf sonuçlar alıyorum.

Örneğin, bu örnek program verilmiştir:

<?php
$t1 = strtotime("3:15:00",0);
$t2 = strtotime("1:00:00",0);
$t3 = strtotime("2:00:00",0);
$t4 = strtotime("9:00:00",0);

echo $t1 . "\n";
echo $t2 . "\n";
echo $t3 . "\n";
echo $t4 . "\n";
?>

Neden bu sonuçlar alabilirim?

$ php test.php 
-56700
-64800
-61200
-36000

Update:

Kimse açıkça söyledi yana, bana yukarıdaki işlevi hata anlatalım. Garip sesler, ama benim amaçlar için çalışacak - I) strtotime (sıfır bir zaman geçen zamanı gece yarısından itibaren elde edilen pulları, 1969/12/31, UTC üretmesine sebep olacağını kabul etmişti.

Ne sayılmaz vardı dizeleri dönüştürürken strtotime () dikkate saat dilimleri alır ve benim sunucu 5 saat UTC arkasında görünüşte olduğu idi. Bunun üstüne, çünkü zaman dilimi kayması, PHP ardından the day before the epoch ki bu Aralık 30th, 1969 göreli meydana yerine olarak benim kez yorumlamak demektir göreli olarak kez yorumlar Negatif sayılar sonuçlanan 31, ...

Eugene doğru olduğunu görünür - Ben sadece geçen zamanı hesaplamak istiyorsanız, ben zaman fonksiyonları inşa kullanamazsınız.

5 Cevap

Eğer böyle bir şey yapmak istiyorsanız, ben sadece zaman dizeleri kendilerini bazı matematik yapmak ve bu gibi saniye, bir dizi dönüştürmek istiyorum düşünüyorum:

<?php
function hmstotime($hms)
{
    list($hours, $minutes, $seconds) = explode(":",$hms);
    return $hours * 60 * 60 + $minutes * 60 + $seconds;
}
?>

Görünüşe göre sadece çıplak kez PHP tarih 31 Aralık 1969 atama I Bu koştu.:

echo date('F j, Y H:i:s', $t1) . "\n";
echo date('F j, Y H:i:s', $t2) . "\n";
echo date('F j, Y H:i:s', $t3) . "\n";
echo date('F j, Y H:i:s', $t4) . "\n";

Bende bu var:

December 31, 1969 03:15:00
December 31, 1969 01:00:00
December 31, 1969 02:00:00
December 31, 1969 09:00:00

strtotime 1 Ocak 1970 yılından bu yana saniye sayısı olarak tanımlanan bir UNIX zaman damgası döndürür unutmayın. Böylece rağmen adı {[(tanım olarak UNIX zaman damgası, belirli bir ay / gün / yıl gelir 0)]} gerçekten tarihleri ​​olmadan çıplak kez yönelik değildir.

Strtotime () ikinci argüman göreli saniye sayısını verir, çünkü (sizin durumda, Unix dönem (31 Aralık 1969 19:00:00)).

"03:15:00" Unix dönemi öncesi 56700 saniyedir çünkü negatif sayılar bekleniyor.

strtotime(), ikinci bir argüman olmadan verilen dizeden zaman alır ve geçerli tarihten itibaren boşlukları doldurur:

echo date('Y-m-d H:i:s', strtotime("3:15:00"));
-> 2009-06-30 03:15:00

İkinci argüman sayesinde ikinci argüman göreli tarihini hesaplar:

echo date('Y-m-d H:i:s', strtotime("3:15:00", 0));
-> 1970-01-01 03:15:00

Saniye içinde iki zaman damgaları arasındaki farkı hesaplamak için, sadece bu yapabilirsiniz:

echo strtotime("3:15:00") - strtotime("3:00:00");
-> 900

Edit: Tabii ki büyük sayı olduğunu dikkate alarak:

$t1 = strtotime("3:15:00");
$t2 = strtotime("3:30:00");

$diff = max($t1, $t2) - min($t1, $t2);
$diff = abs($t1 - $t2);

Ya da doğanın bir şey ...

İkinci parametre olmadan deneyin. O döndü zaman göreli olması için bir zaman damgası olması gerekiyordu. O 0 Giving Unix dönemi için bir zaman damgası akrabası soran demektir.

Yorumlarınız yanıt olarak:

Bu işlevsellik belgelenmiş, ama strtotime("HH:MM") her zaman kullanmak, ve şimdiki zaman için bir zaman damgası akrabası döndürür değil. Ben olsa emin olmak istiyorsanız, bunu sanırım:

strtotime("3:15:00",time());