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.