Rails 3'te UTC'yi yerel saate çevirin


95

Rails 3'te bir UTC'yi Timeveya TimeWithZoneyerel saate dönüştürmede sorun yaşıyorum .

De ki momentbazı olduğunu TimeUTC (örneğin değişken moment = Time.now.utc). momentDST ile ilgilenerek (yani EST / EDT kullanarak) saat dilimime nasıl dönüştürebilirim ?

Daha doğrusu, saat bu sabah 9 AM EDT'ye karşılık geliyorsa "14 Mart Pazartesi 09:00" ve saat geçen pazartesi 09:00 EST ise "7 Mart Pazartesi 09:00" çıktısını almak isterim.

Umarım başka bir yolu vardır?

Düzenleme : İlk önce "EDT" nin tanınan bir saat dilimi olması gerektiğini düşündüm , ancak "EDT" daha çok bir saat diliminin durumu gibi gerçek bir saat dilimi değil. Mesela istemenin bir anlamı yok Time.utc(2011,1,1).in_time_zone("EDT"). "EST" , Günışığı tasarruf zamanını kullanmayan ve (UTC-5) yıllık olan birkaç yerde kullanılan gerçek bir saat dilimi olduğundan biraz kafa karıştırıcıdır .

Yanıtlar:


113

Rails'in kendi isimleri vardır. Onları şununla görün:

rake time:zones:us

Ayrıca rake time:zones:alltüm zaman dilimleri için de koşabilirsiniz . Bölgeyle ilgili daha fazla komisyon görevi görmek için:rake -D time

Yani, EST'ye dönüştürmek için, otomatik olarak DST için ikram:

Time.now.in_time_zone("Eastern Time (US & Canada)")

21
Web uygulamasına erişen kullanıcı için saat dilimini otomatik olarak nasıl kullanabilirsiniz?
dmonopoly

Bulduğum tek yol Javascript ile ve ardından onu sunucuya geri iletmekti. (new Date()).getTimeZoneOffset(). Ama oldukça tutarsız, bu yüzden bu adam kendi yazmış gibi görünüyor: onlineaspect.com/2007/06/08/…
Duke

2
saat dilimini tüm ActiveRecord tarih zamanlarına otomatik olarak ekle - config.time_zone = 'Doğu Saati (ABD ve Kanada)' - config / application.rb içinde
idrinkpabst

Güncelleme: bağlantılı JS çözümünün sahibi daha yeni bir çözüme işaret ediyor: pellepim.bitbucket.org/jstz
Miles

@dmonopoly uygulama yapılandırmasında saat dilimini ayarlayabilir config.time_zone = 'Wellington've ardından Time.current kullanabilirsiniz (bu, time.now ile eşdeğerdir, ancak ayarladığınız Zaman Dilimini kullanır)
Sean

116

Time#localtime kodu çalıştıran makinenin geçerli saat dilimindeki saati size verecektir:

> moment = Time.now.utc
  => 2011-03-14 15:15:58 UTC 
> moment.localtime
  => 2011-03-14 08:15:58 -0700 

Güncelleme: Kendi saat diliminiz yerine belirli saat dilimlerine dönüştürmek istiyorsanız, doğru yoldasınız. Bununla birlikte, EST ile EDT hakkında endişelenmek yerine, genel Doğu Saat dilimini geçmeniz yeterlidir - EDT veya EST olup olmadığını güne göre bilecektir:

> Time.now.utc.in_time_zone("Eastern Time (US & Canada)")
  => Mon, 14 Mar 2011 11:21:05 EDT -04:00 
> (Time.now.utc + 10.months).in_time_zone("Eastern Time (US & Canada)")
  => Sat, 14 Jan 2012 10:21:18 EST -05:00 

Bu bir başlangıç. Geçerli saat dilimini nasıl ayarlayabilirim (uygulamanın nerede barındırılacağından bile emin olmadığım için, sunucu farklı bir saat diliminde olabilir ve ardından neyin kullanılması gerekir).
Marc-André Lafortune

6
"Yerel zaman" yöntemi harikadır, ancak kodu çalıştıran makinenin saat dilimi, web uygulamasına erişen kullanıcının saat dilimi kadar yararlı değildir. (Burada bahsedildiği gibi: stackoverflow.com/questions/6003491/rails-3-user-timezones/… ) Web uygulamasına erişen kullanıcı için saat dilimini nasıl edinebilirsiniz?
dmonopoly

@daze Kullanıcılarınızın saat dilimlerini seçmeleri için bir seçenek ayarlayabileceğinizi ve ardından bu in_time_zoneyöntemi kendi saat dilimlerinde kullanabileceğinizi düşünüyorum.
Dylan Markow

1
Teşekkürler, yerel zaman yöntemi tam da ihtiyacım olan şey.
Bob

Time.now.localtimenormal bir irb oturumunda çalışıyor ancak UTC saat diliminde olan bir makinede çalıştırmayı denediğimde çalışmıyor.
Ava

15

Sistem yerel bölgenizi kullanarak, sadece uygulamanızda yapılandırmak kolaydır. Rb bunu ekleyin

config.time_zone = Time.now.zone

Ardından, raylar size yerel zamanınızda zaman damgaları göstermelidir veya yerel zamanı öğrenmek için bu talimat gibi bir şey kullanabilirsiniz.

Post.created_at.localtime

15

Aslında local_timebasecamp tarafından tüm bunları sadece müşteri tarafında yapmak için güzel bir Gem var, inanıyorum:

https://github.com/basecamp/local_time


Bu en iyi sonucu verir. Zaten depolanan zamanı, bunu kullanıcıya formatta göstermenin yolunun bence en iyi müşteri tarafında yapıldığını biliyoruz ve bunu yapıyor.
Neeraj Shukla

1

Nedenini bilmiyorum ama benim durumumda daha önce önerilen şekilde çalışmıyor. Ama şu şekilde çalışıyor:

Time.now.change(offset: "-3000")

Elbette offsetdeğeri kendinize göre değiştirmeniz gerekiyor .


0

Aslında bunu sadece kullanıcının saat dilimini almak istediğiniz için yapıyorsanız, yapmanız gereken tek şey kendi saat diliminizi değiştirmek config/applications.rb.

Bunun gibi:

Rails, varsayılan olarak, geçerli saat dilimini belirtseniz bile saat kaydınızı UTC olarak kaydeder.

config.time_zone = "Singapore"

Yani tek yapmanız gereken bu ve gitmekte fayda var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.