"Date_part (saat diliminde artık 'çağ', () 'UTC')"

1 Cevap php

Ben çeşitli tarihler / süreleri depolamak gerekir (PHP / PostgreSQL) olan bir veritabanı için bir web tabanlı ön uç yazıyorum. Süreleri her zaman yerel saatle istemci tarafında girilen ve çok yerel saat görüntülenecek içindir. Depolama amaçlı, ben tamsayılar (UNIX zaman damgaları) ve UTC normalize olarak tüm tarih / süreleri depolamak. Bir özel alan doldurulur damgası gelecekte izin verilmez bir kısıtlama var, bu yüzden bir veritabanı kısıtlaması ile bu çalıştı ...

KISITLAMA not_future FİYATLARI (zaman damgası-300 <= date_part (zaman dilimi 'UTC' şimdi 'çağ', ()))

The -300 is to give 5 minutes leeway in case of slightly desynchronised times between browser and server. The problem is, this constraint always fails when submitting the current time. I've done testing, and found the following.

PostgreSQL istemci:

Şimdi SEÇ () - döndürür yerel saati düzeltin

SEÇ date_part (şimdi 'çağ', ()) - (zaman zaman dilimi olan tazminat düzelterek PHP tarih fonksiyonu içine yem değeri tarafından test) UTC de bir Unix zaman damgası döndürür

SEÇ date_part (saat diliminde artık 'çağ', () 'UTC') - batı iki zaman dilimi uzaklıklar bir unix zaman damgası döndürür, örneğin Ben GMT-2 damgası olsun, GMT +2 duyuyorum.

Ben "saat diliminde 'UTC'" bırakarak benim sorunumu çözecek tabii ki düşündüm, ama 'çağ' AFAIK hep UTC olmak içindir bir unix zaman damgası dönmek içindir eğer benim soru, niye Zaten UTC bir zaman 'çağ' düzeltilebilir? Bu bir hata mı, yoksa ben burada tanımlı / normal davranış hakkında bir şeyler eksik.

1 Cevap

"Şimdi () saat diliminde 'UTC'" değeri geçerli saat UTC taşındı ve ardından dönüştürülen TIMESTAMP WITHOUT TIME ZONE.

Yani "date_part" TIME ZONE OLMADAN bir ZAMAN (diğer bir deyişle bilinmeyen saat dilimi) vermek ve bilinen zaman diliminde ("Epoch", 1970-01-01 00 de o ve sabit bir zaman damgası arasındaki saniye farkı almayı bekliyorum: 00:00 UTC).

Postgres Bu hesaplamak için ZAMAN BÖLGE İLE ZAMAN gerekiyor. Bu yüzden zaman dilimi için değerini 'UTC' assuming it's at your time zone dönüştürür ve farkı hesaplar.

Gibi bir şey:

select ((now() at time zone 'UTC') at time zone '<your_time_zone>') at time zone 'UTC';