0

Rails で設定するために application.rb オーダーの config.time_zone に渡すことができる独自のタイム ゾーンを取得する方法を探しています。背景: ユーザーが yaml 構成でタイムゾーンを指定できるようにしていますが、設定されていない場合は、ボックスのタイムゾーンを明示的に使用したいと考えています。表示用にタイムゾーンを変換するための参照として使用しているため、値を設定する必要があります。Rails アプリにログインしている各ユーザーは、自分のタイムゾーンを設定でき、私が変換を行います。

ただし、Ruby や Rails でこれを行うための適切な API はないようです。Time.now.zone は 3 文字のコード (EDT や CDT など) を返しますが、十分に具体的ではないため、これを渡すことはできません。TZInfo クラスは「長い」説明のみを受け入れます。

これが私が今やっていることです。これはかなりハッキーなようです:

time_zone = CONFIG[:time_zone] # set your local time zone here. use rake time:zones:local to choose a value, or use UTC.

unless time_zone
  # try to detect one

  if File.exists?('/etc/localtime')
    path = File.readlink('/etc/localtime')
    items = path.split("zoneinfo/")
    if items.length == 2
      time_zone = items[1]
    end
  end

  unless time_zone
    puts "*** Warning:  no time zone is set in config/config.yaml and could not detect system time. Using UTC as the default time; behavior may be unexpected."
    time_zone = "UTC"
  end
end

config.time_zone = time_zone

もっと良いアイデアはありますか?

4

4 に答える 4

3

次のことを試すことができます。

off_set = Time.now.gmt_offset
p ActiveSupport::TimeZone[off_set].name # "Atlantic Time (Canada)"

また

p ActiveSupport::TimeZone[off_set].tzinfo.name # "America/Halifax"
于 2013-04-10T15:20:12.010 に答える
0

3 文字のコードは正確ではないため、ユーザーにIANA タイム ゾーン データベースからフル ネームを指定してもらいます。

Time.zone = 'America/Halifax'次に、 (たとえば)を使用できます。
Time.zone.nameIANA 名をTime.zone.now返し、指定されたタイムゾーンで現在の時刻を返します。

プログラムでこの形式のタイムゾーンを見つけるには、利用可能な場合は使用できる/etc/timezone場合があります。他のシステムには他の方法があります (1 つでも利用可能な場合)。

于 2016-05-03T16:25:12.490 に答える