2013-03-27 8 views
8

jestem tutaj na Ubuntu 12.04, i widzę:Czy mogę przesłonić strefę czasową systemu w Ruby?

$ cat /etc/timezone 
America/Phoenix 

Odpowiednio Time zwróci czas ze strefy non-UTC:

$ irb 
> Time.now 
=> 2013-03-27 13:44:49 -0700 
> Time.at 0 
=> 1969-12-31 17:00:00 -0700 

mogę nadpisać czas systemowy strefa użyciu zmiennej TZ środowiska:

$ TZ=UTC irb 
> Time.now 
=> 2013-03-27 20:47:19 +0000 
> Time.at 0 
=> 1970-01-01 00:00:00 +0000 

Czy istnieje anyw Czy mogę wprowadzić tę zmianę programowo, w ramach procesu Ruby?

+0

Twoje pytanie jest dość nieprecyzyjne. Nie przeceniaj przydatności, jaką zapewniałby kontekst. – BM5k

Odpowiedz

8

Można również ustawić zmienne środowiskowe z poziomu Ruby od dostępu do ENV hash:

ENV['TZ'] = 'UTC' 
Time.at 0 
#=> 1970-01-01 00:00:00 +0000 

zobaczyć również tę odpowiedź: Set time zone offset in Ruby , Zapewnia sposób na napisanie czegoś podobnego do:

1

Możesz użyć Time#gmtime. Na przykład

Time.now 
# => Wed Mar 27 16:55:11 -0400 2013 
Time.now.gmtime 
# => Wed Mar 27 20:55:14 UTC 2013 
Time.at(0) 
# => Wed Dec 31 19:00:00 -0500 1969 
Time.at(0).gmtime 
# => Thu Jan 01 00:00:00 UTC 1970 

Time#utc również działa i jest aliasem dla Time#gmtime

+0

To jest świetne, aby dowiedzieć się, jak uzyskać czasy oparte na UTC, ale to nie pomaga, gdy potrzebna strefa czasowa nie jest UTC. – javawizard

1

W zależności od przypadku, ActiveSupport oferuje wiele zalet związanych z TimeZone.

$ gem install activesupport 
$ irb 
> require 'active_support/time'   # => true 
> Time.zone = 'Pacific Time (US & Canada)' # => "Pacific Time (US & Canada)" 
> Time.zone.now       # => Wed, 27 Mar 2013 16:14:19 PDT -07:00 

ActiveSupport może być większą zależnością niż się chce, ale nie należy tego przeoczyć.