PHP dilimleri ile uğraşan

4 Cevap php

PHP dilimleri ile bazı sorunlar bir süre için şimdi aklımın arkasında olmuştur ve ben şu anda ne yapıyorum daha bunu işlemek için daha iyi yollar var olup olmadığını merak ediyordum.

Sorunların tüm veritabanı depolanan tarihleri ​​reformating etrafında döner:

Saklanan damgalarının dilimi offest normalleştirmek için, (kullanıcılar için) birden timezones desteklemek için bir site ile uğraşırken ben hep CURRENT_TIMESTAMP nitelik veya {kullanarak sunucu timezone ile saklayabilirsiniz [(1)] } function.

Bu şekilde ben (PHP zaman fonksiyonları farkında timezone beri) damgası girildiği zaman PHP için ne ayarlanmış dilimi düşünmek zorunda değilsiniz. Her kullanıcı için, kendi tercihinize göre ben kullanarak benim önyükleme dosyasında bir yerde zaman dilimini ayarlayın:

date_default_timezone_set($timezone);

Ben php date() fonksiyonu ile tarihleri ​​biçimlendirmek için aradığım zaman, dönüşüm çeşit MySQL şu formatta damgası saklar yana yer almak zorundadır Y-m-d H:i:s. Timezone hiçbir konuda, sadece çalıştırabilir:

$date = date($format,strtotime($dbTimestamp));

Bu sorun olduğunu date() ve strtotime() PHP timezone farklı sunucu dilimine ayarlanır ise, ofset dilimi iki kez uygulayın (yerine olacak, yani her iki zaman dilimi farkında fonksiyonları biz istiyoruz gibi bir kez).

Böylece sadece bir kez ofset dilimini uygulayarak - Bu anlaşma için, ben genellikle benim date() doğrudan uygulamak için izin, farkında timezone değil UNIX_TIMESTAMP() fonksiyonunu kullanarak MySQL damgalarını almak.

Ben gerçekten de bu 'hack' gibi artık ben normalde olduğu gibi bu sütunları almak, ya da * (bazen büyük ölçüde sorguları basitleştiren) tüm sütunları almak için kullanabilirsiniz değilsiniz. Ayrıca, bazen sadece (sorgu kompozisyon için çok soyutlama olmadan açık kaynak paketleri ile kullanırken özellikle) UNIX_TIMESTAMP() kullanmak için bir seçenek değil.

Bir PHP oluşturulan damgası depolamak Ben önlemek istiyorum ofset timezone ile saklayın - CURRENT_TIMESTAMP veya NOW() bir seçenek değildir kullanımı damgası, saklarken başka bir konudur.

Herhalde burada gerçekten temel bir şey eksik, ama ben onları case-by-case tedavi etmek zorunda değilim, şimdiye kadar ben bu konuları işlemek için genel bir çözüm ile gelip mümkün olmamıştır. Düşünceleriniz çok açığız

4 Cevap

Birkaç ay önce bu konuda düşünmeye biraz zaman geçirdim. Biz erdi tekniği oldukça basittir:

  1. GMT / UTC depolayın tarihleri ​​(örn. 0 saat dilimi farkı).
  2. (Istediğiniz kullanıcı veya zaman için göstermeden önce örneğin) veritabanından alma sonra ofset geçerli kullanıcı dilimini uygulayın.

Biz Unix zaman damgaları biçimini kullanın. Ama bu önemli değil.

PHP 5.2 yana kolay dilimleri ile çalışma yapar DateTime kullanabilirsiniz:

$datetime = new DateTime($dbTimestamp, $timezone);
echo $datetime->format('Y-m-d H:i:s');
$datetime->setTimezone(new DateTimeZone('Pacific/Nauru'));
echo $datetime->format('Y-m-d H:i:s');

Ben bu yüzden bir Timezone HTML select generator komut oluşturduk ve burada output, doğrudan çevrimiçi olduğunu Zarif herhangi bir çözüm bulamadık. Böyle bir şey var:

<select name="timezone" id="timezone">
    <optgroup label="UTC -11:00">
        <option value="Pacific/Midway">UTC -11:00 Midway</option>
        <option value="Pacific/Niue">UTC -11:00 Niue</option>
        <option value="Pacific/Pago_Pago">UTC -11:00 Pago_Pago</option>
    </optgroup>
    <optgroup label="UTC -10:00">
        <option value="America/Adak">UTC -10:00 Adak</option>
        <option value="Pacific/Honolulu">UTC -10:00 Honolulu</option>
        <option value="Pacific/Johnston">UTC -10:00 Johnston</option>
        <option value="Pacific/Rarotonga">UTC -10:00 Rarotonga</option>
        <option value="Pacific/Tahiti">UTC -10:00 Tahiti</option>
    </optgroup>
    . . . . . . . . . . . . . .
    <optgroup label="UTC +13:00">
        <option value="Pacific/Apia">UTC +13:00 Apia</option>
        <option value="Pacific/Enderbury">UTC +13:00 Enderbury</option>
        <option value="Pacific/Fakaofo">UTC +13:00 Fakaofo</option>
        <option value="Pacific/Tongatapu">UTC +13:00 Tongatapu</option>
    </optgroup>
    <optgroup label="UTC +14:00">
        <option value="Pacific/Kiritimati">UTC +14:00 Kiritimati</option>
    </optgroup>
</select>

Tadını çıkarın!