Jeśli tak d = DateTime.now, jak zamienić „d” na UTC (z odpowiednią datą)?
Odpowiedzi:
d = DateTime.now.utc
Ups!
To wydaje się działać w Railsach, ale nie w waniliowym Ruby (i oczywiście o to chodzi w pytaniu)
d = Time.now.utc
Działa jednak.
Czy jest jakiś powód, dla którego musisz używać, DateTimea nie Time? Timepowinien zawierać wszystko, czego potrzebujesz:
irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009
DateTime.now.new_offset(0)
będzie działać w standardowym Rubim (tj. bez ActiveSupport).
new_offsetargument metody domyślnie 0już. Więc DateTime.now.new_offsetmoże być również używany.
Niestety, klasa DateTime nie ma wygodnych metod dostępnych w klasie Time, aby to zrobić. Możesz przekonwertować dowolny obiekt DateTime na UTC w następujący sposób:
d = DateTime.now
d.new_offset(Rational(0, 24))
Możesz przełączyć się z czasu UTC na czas lokalny za pomocą:
d.new_offset(DateTime.now.offset)
gdzie djest obiektem DateTime w czasie UTC. Jeśli chcesz, aby były to wygodne metody, możesz je utworzyć w następujący sposób:
class DateTime
def localtime
new_offset(DateTime.now.offset)
end
def utc
new_offset(Rational(0, 24))
end
end
Możesz to zobaczyć w akcji w następującej sesji IRB:
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"
Jak widać powyżej, początkowy obiekt DateTime ma przesunięcie -04: 00 (czas wschodni). Jestem w czasie pacyficznym z przesunięciem -07: 00. Wywołanie localtimezgodnie z wcześniejszym opisem prawidłowo konwertuje obiekt DateTime na czas lokalny. Wywołanie utcobiektu poprawnie konwertuje go na przesunięcie czasu UTC.
Możesz ustawić ENV, jeśli chcesz Time.nowi DateTime.nowodpowiadać w czasie UTC.
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"