Unix timestamp içine ISO Tarih dönüştürmek için en etkili yolu?

5 Cevap php

Benim uygulamada, ben biraz zaman parametrelerine dayalı filtre gereken bazı kayıtları var. Tarih karşılaştırmalar yapmak için, I (1970 yılından beri saniye) bir unix zaman damgası, benim kayıtlarda tarihleri ​​(YYYY-AA-GG bir dize) dönüştürmek gerekir. Ben kayıtları binlerce var, ben gerçekten bunu yapmak için en etkili yolu bulmak istiyorum.

another question strtotime() veya strptime() kullanılarak, (ne yazık ki, burada bir seçenek değil) veritabanında yaptığını öne sürdü, ancak bu yok değil {[(3 cevaplar )]} en bellek ve zaman-etkin yöntemler gibi, biliyor musun?

Benim girişi tam biçim mktime daha iyi olabilir, belki de (substr, ya da explode) dize manipülasyon bazı formunu kullanarak olacaktır ile birlikte biliyor göz önüne alındığında?

If you believe I'm being premature in my optimisation, then just humour me ok?

5 Cevap

Neden strtotime () etkin bir işlev değil sizce? Herhangi kriterler yaptık. Eğer gelip bir şey php tercüman aracılığıyla çalışacak ise strtotime (), C doğrudan yazılı bir yerleşik kütüphane işlevi olduğunu unutmayın.

Ayrıca artık yıl ve saat dilimleri gibi konularda yapmak, tarih hesaplamaları doğal zor olduğunu akılda tutmak.

Bir alternatif daha hızlı bir yöntem gelince, ben () ayrıştırmak için bir regex daha hızlı olacak substr kullanarak düşünüyorum. Mktime () için sonuçları Yem ve hazırsınız.

strtotime Ne kadar gelebilir şey daha hızlı bir yoldur (ve ben Waaay demek).

Nasıl olasılıkla tarihlerin kayıtlarında reapeated olabilir? Onlar tamamen benzersiz değilse, önbelleğe çeşit yapabilirsiniz. Eğer bir sınıfta olduğunuzu varsayarak:

protected $_timestamps = array();

public function toTimestamp($date)
{
    if (!array_key_exists($date, $this->_timestamps)) {
        $this->_timestamps[$date] = strtotime($date);
    }
    return $this->_timestamps[$date];
}

Şimdi sadece yapmanız gereken:

foreach ($records as $record) {
    $timestamp = $this->toTimestamp($record->date);
}

Tamam, ben 4 farklı yöntemler kıstas var:

function _strtotime($date) {
    return strtotime($date);
}

function _preg($date) {
    preg_match("@^(\\d+)-(\\d\\d)-(\\d\\d)$@", $date, $matches);
    return mktime(0, 0, 0, $matches[2], $matches[3], $matches[1]);
}

function _explode($date) {
    list($y,$m,$d) = explode("-", $date);
    return mktime(0, 0, 0, $m, $d, $y);
}

function _substr($date) {
    $y = substr($date, 0, 4);
    $m = substr($date, 5, 2);
    $d = substr($date, 8);
    return mktime(0, 0, 0, $m, $d, $y);
}

// I also added this one as sort of a "control"
function _hardCoded() {
    return mktime(0, 0, 0, 3, 31, 2009);
}

Ve burada her fonksiyonunu 100.000 kez çalışan sonuçları. Girişi ile "2009-03-31"

_hardCoded: 2.02547
_strtotime: 2.35341
_preg:      2.70448
_explode:   2.31173
_substr:    2.27883

Eğer gerçekten bunu yapmak için en verimli şekilde isterseniz, bunu tüm önerdi yolları, artı bulmak herhangi başkalarına yapmak zorunda bazı kıyaslama yapmak ve kazanan seçecektir gibi geliyor bana.

Dize güzel inşa-up gibi, ben soldan sağa dize yürüyüş damgası oluşturmak istiyorum. Sen bir tablo önceden inşa edebilirsiniz yıllarda-> saniye, ay -> saniye, gün -> saniye ve artık yıllar için doğrudur. Çarpma kötülük :)

Veya daha az çabayla, çiftleri ortadan kaldırmak için bir hashtable oluşturmak.

Ama daha hızlı olması için bu kayıtları bir sürü gerekir. Ve bunu bir veritabanı kullanıyorsanız geliyor. Bu hızlı ile uyumsuz ...