2016-03-29 33 views
1

Spor etkinliklerini listeleyen bir uygulamamız var. Bir etkinlik 2 takımla ilişkilidir (ev sahibi takım ve uzak takım). Etkinlik listesinde, etkinliğin tarihini ev sahibinin saat diliminde gösteririz. Veritabanındaki tarihleri ​​UTC'de saklıyoruz. Etkinlik listesi sayfasında bir tarih filtresi eklememiz gerekiyor, ancak sorun şu ki, tarihi UTC'de db olarak saklıyoruz ve etkinlik listesindeki tarihler, ev ekibinin saat diliminde gösteriliyor. Tarih filtresi beklenmedik sonuçlar. db'de tarih 2016-02-18 03:30:00+00 (UTC) olarak kaydedilir. Olay listesinde kullanıcıya gösterildiğinde, ev sahibi takım Pennsylvania'da ve zaman dilimi America/New_York olduğundan, 02/17/2016 7:30pm numarasıdır. tarih filtresi kullanıcı tarafından 02/17/2016 olarak ayarlandığında, tarihin 02/17/2016 olduğu tüm olayları almak için db'yi sorgulıyoruz. Beklenmedik sonuçlara neden olacağından, etkinlik ile eşleşmeyeceği için db tarihimiz 02/18/2016'dur.Öğelerin farklı saat dilimlerinin olduğu bir listede bir tarih filtresi uygulamanın iyi bir yolu nedir?

Düşünebildiğim bir çözüm, olay listesinde 2 numaralı tarihte & zaman sütunudur.

Tarih (UTC) | Zaman (UTC) | Tarih (Ev sahibi takımının saat dilimi) | Zaman (Ev takımın zaman bölgesi)

Ve tarih filtre kullanarak zaman tarih (utc)

kullanarak olayları filtreler Ama şu anda daha iyi bir çözüm arıyorsanız bu kullanıcıyı bilgilendirmek. Herhangi bir yardım/öneri büyük takdir :)

EDIT:

event 1: 
    - date: 01/12/2016 
    - time: 9:00am 
    - home team's timezone: America/Chicago 
event 2: 
    - date: 01/12/2016 
    - time: 9:00am 
    - home team's timezone: America/Denver 
event 3: 
    - date: 01/12/2016 
    - time: 9:00am 
    - home team's timezone: Asia/Singapore 

kullanıcı tarih filtresinde 2016/01/12 seçerse. Yukarıdaki 3 etkinliği hala göstermelidir.

+0

Eğer tarih filtresi için kullandığınız bize söyleyebilir misin? Yaptığınız bu manuel kod mu yoksa çerçeve mi? AngularJS gibi bazı çerçeveler, zaman dilimlerini filtreye yapılandırabilirsiniz. –

+0

Bir datepicker kullanıyorum - https://angular-ui.github.io/bootstrap/#/datepicker.Kullanıcı bir tarih seçtiğinde, seçilen tarihe göre filtrelenen olayların listesini almak için bir API isteği yürütülür. Sorum şu UI/UX hakkında. –

cevap

0

Veritabanında tarihleri ​​yerel saatinde depolayan ve sonuçları filtrelemek için bu alanı kullanan yeni bir alan ekleyin.

böylece, diyelim 2016-04-01 filtrelediğinizde, aslında farklı saat dilimleri yani

yüzden bana mesela etkinliklerin hepsini göstermek aynı Epoch anda olmayan olaylar karşısında şeyler filtreleme olacak Perşembe, takımların nerede olduğuna bakılmaksızın (bir takımın perşembesinin bir başka takımın cuma günü olduğu anlamına gelir)

, tarihin nerede depolandığı her yerde yerelleştirilmiş sonuçları filtreleyecektir.

Başka bir çözüm, anında dönüştürme sorgusu kullanmaktır.

Örnek:

where convert_to_local_without_timezone(event_datetime, event_tz) = date_filter 

Bir kullanıcı tanımlı işlev olabilir - Bunu başarmak hiçbir mevcut fonksiyonu varsa http://www.postgresql.org/docs/8.0/static/xfunc.html. için

Kredi:

Koç, Ryan Johnson ve Nikki Erwin Ramirez