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.