Ruby'de DateTime.now'u UTC'ye nasıl dönüştürebilirim?


98

Varsa d = DateTime.now, 'd'yi UTC'ye (uygun tarihle) nasıl dönüştürebilirim?

Yanıtlar:


156

d = DateTime.now.utc

Oops!

Bu, Rails'de işe yarıyor gibi görünüyor, ancak Ruby'de değil (ve tabii ki sorunun sorduğu şey bu)

d = Time.now.utc

Ancak çalışıyor.

Kullanmanız gereken bir sebebi var mı DateTimedeğil Time? Timeihtiyacınız olan her şeyi içermelidir:

irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009

Çünkü dönüşüm için doğru tarihi istiyorum, yani GMT +10 için ertesi gün ileride olabilir ...
Kül

2
Zaman bunu senin için yapacak. Saat, yalnızca günün saatini değil, tarih bölümünü de içerir. Bir göz atmak için Time.now.inspect yapın.
DanSingerman

2
Oh tatlı. Öyleyse Date, Time ve DateTime arasındaki fark nedir?
Ash

18
Zaman dahili olarak 1 Ocak 1970 00:00 UTC döneminden bu yana geçen saniye ve mikrosaniye sayısı olarak depolanır. Tarih, dahili olarak Astronomik Jülyen Gün Numarası olarak temsil edilir ve DateTime düpedüz tuhaftır (muhtemelen Rails bunu geçersiz kılar)
DanSingerman

169
DateTime.now.new_offset(0)

standart Ruby'de çalışacaktır (yani ActiveSupport olmadan).


3
Ve bu aslında sorunun en doğru cevabı.
Ernest

2
Bunun daha fazla olumlu oyu olmalı. DateTime, Time'dan farklıdır. Tam olarak buna ihtiyacım vardı.
d11wtq

1
new_offsetyöntem bağımsız değişkeni varsayılan olarak 0zaten. Bu yüzden DateTime.now.new_offsetde kullanılabilir.
Cryptor

8

Ne yazık ki, DateTime sınıfı bunu yapmak için Time sınıfında kullanılabilen uygunluk yöntemlerine sahip değildir. Herhangi bir DateTime nesnesini şu şekilde UTC'ye dönüştürebilirsiniz:

d = DateTime.now
d.new_offset(Rational(0, 24))

Aşağıdakileri kullanarak UTC'den yerel zamana geri dönebilirsiniz:

d.new_offset(DateTime.now.offset)

dUTC saatine göre bir DateTime nesnesi nerede . Bunları kolaylık yöntemleri olarak istiyorsanız, bunları şu şekilde oluşturabilirsiniz:

class DateTime
  def localtime
    new_offset(DateTime.now.offset)
  end

  def utc
    new_offset(Rational(0, 24))
  end
end

Bunu aşağıdaki irb oturumunda eylem halinde görebilirsiniz:

d = DateTime.now.new_offset(Rational(-4, 24))
 => #<DateTime: 106105391484260677/43200000000,-1/6,2299161> 
1.8.7 :185 > d.to_s
 => "2012-08-03T15:42:48-04:00" 
1.8.7 :186 > d.localtime.to_s
 => "2012-08-03T12:42:48-07:00" 
1.8.7 :187 > d.utc.to_s
 => "2012-08-03T19:42:48+00:00" 

Yukarıda görebileceğiniz gibi, ilk DateTime nesnesinin -04: 00 uzaklığı (Doğu Saati) vardır. Pasifik Saati ile -07: 00 farkındayım. localtimeDaha önce açıklandığı gibi arama , DateTime nesnesini düzgün bir şekilde yerel saate dönüştürür. utcNesneyi çağırmak , onu düzgün bir şekilde UTC sapmasına dönüştürür.


5

Bunu dene, Ruby'de çalışıyor :

DateTime.now.to_time.utc

4

UTC saatinde yanıt vermek Time.nowve DateTime.nowyanıtlamak istiyorsanız bir ENV ayarlayabilirsiniz .

require 'date'
Time.now #=> 2015-11-30 11:37:14 -0800
DateTime.now.to_s #=> "2015-11-30T11:37:25-08:00"
ENV['TZ'] = 'UTC'
Time.now #=> 2015-11-30 19:37:38 +0000
DateTime.now.to_s #=> "2015-11-30T19:37:36+00:00"

2

İrb'de:

>>d = DateTime.now
=> #<DateTime: 11783702280454271/4800000000,5/12,2299161>
>> "#{d.hour.to_i - d.zone.to_i}:#{d.min}:#{d.sec}"
=> "11:16:41"

zamanı utc'ye dönüştürür. Ancak yayınlandığı gibi yalnızca Zaman ise kullanabilirsiniz:

Time.now.utc

ve hemen alın.


1

Bir DateTime'ın dize temsili Time sınıfı tarafından ayrıştırılabilir.

> Time.parse(DateTime.now.to_s).utc
=> 2015-10-06 14:53:51 UTC
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.