datetime - Farklı yerel ayar ve zaman diliminde Javascript tarih nesnesi


Farklı bölgelerdeki insanların etkinliklerini gösteren bir web uygulaması yazmam gerekiyor. Neredeyse bitirdim, ama tarihle ilgili 2 sorun var:

  • JavaScript tarih nesnesini kullanmak, tarih kullanıcının bilgisayar ayarlarına bağlıdır ve güvenilir değildir
  • Eğer kullanıcının mevcut konumuna göre farklı bir zaman diliminde bir etkinlik varsa, bunu () içinde yazdırmam gerekiyor. Belirli bir zaman dilimi ve yaz saati ayarlarıyla bir tarih nesnesi oluşturmak JavaScript'te mümkün mü?

Ayrıca jsdate ve tarih web servisleri gibi bazı geçici çözümler de buluyorum, ancak bunlar doğru zaman dilimi ve yaz saati ayarlarına sahip bir JavaScript nesnesine sahip olma sorununu (gün ekleme gibi tarih işlemleri için) çözmüyor.

Cevap #1

Aklınızda bulundurmanız gereken birkaç şey.

Tüm etkinlik tarih ve saatlerini UTC zamanında saklayın

Evet, bundan kaçış yok.

Tüm saat dilimlerini öğrenin...

...sistemdeki tüm kullanıcılar. Aşağıdaki tespit betiğini kullanabilirsiniz: http://site.pageloom.com/automatic-timezone-detection-with-javascript. Bu size örneğin "America/Phoenix" gibi bir saat dilimi anahtarı verecektir.

Sizin durumunuzda olay ile birlikte zaman dilimini saklamanız gerekir, çünkü bir kullanıcı zaman dilimini değiştirebilir - ancak olay her zaman belirli bir zaman diliminde gerçekleşmiş olacaktır. (ah)

Görüntüleme mekanizmanızı seçin

Eğer etkinlik tarihlerinizin JavaScript ile yerelleştirilmesini istiyorsanız, bunun için de kullanışlı bir kütüphane mevcut (önceki script ile sağlanan anahtarları kullanabilir). İşte: https://github.com/mde/timezone-js.

o kütüphane ile örneğin bunu yapabilirsiniz:

var dt = new timezoneJS.Date(UTC_TIMESTAMP, 'America/New_York');

veya

var dt = new timezoneJS.Date(2006, 9, 29, 1, 59, 'America/Los_Angeles');

örneğin UTC_TIMESTAMP 1193855400000 olabilir. Ve America/New_York, olayın gerçekleştiği zamanı tespit ettiğiniz zaman dilimidir.

Bundan elde ettiğiniz dt nesnesi normal bir JavaScript Date nesnesi gibi davranacaktır. Ancak belirttiğiniz zaman dilimine (DST dahil) otomatik olarak "düzeltilecektir".

İsterseniz, tüm düzeltmeleri sayfayı sunmadan önce arka planda yapabilirsiniz. Orada hangi programlama dilini kullandığınızı bilmediğim için size hemen herhangi bir ipucu veremem. Ama temelde mantık aynı: timezone'u biliyorsanız ve UTC tarih-saat bilgisine sahipseniz, tarih-saat bilgisini yerelleştirebilirsiniz. Tüm programlama dillerinin bunun için kütüphaneleri vardır.

Cevap #2

Bir Date nesnesinin amacını kaçırıyorsunuz. O, belirli bir zamanı temsil eder. Ben konuşurken, dünyanın her yerinde zaman 1308150623182'dir. Zaman dilimi, yalnızca zamanı kullanıcıya göstermek istediğinizde devreye girer. "Bir gün eklemek" gibi bir işlem ise zamana dilimini hiç içermez.