/ / Як отримати власну TimeZone в рубіні? - рубін на рейки, рубін

Як отримати власний часовий пояс в рубіні? - рубіни на рельсах, рубінові

шукаю спосіб отримати власний часовий пояс, який яможе перейти до config.time_zone у application.rb, щоб встановити його в Rails. Передумови: я дозволяю користувачеві вказати свій часовий пояс у конфігурації yaml, але якщо він не встановлений, я хочу явно використовувати часовий пояс поля "I". мати мати набір значень, тому що я використовую це як посилання для перетворення часових поясів для відображення - кожен користувач, що входить у програму Rails, може встановити свій особистий часовий пояс, і я буду робити перетворення для них.

Однак, здається, немає хорошого API для виконанняце в Ruby або Rails. 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

Якісь кращі ідеї, хлопці?

Відповіді:

1 для відповіді № 1

Будь-яка причина, чому це не працює?

Time.now.zone

Редагувати:

Перш ніж отримати зону, ви можете зробити Time.now.gmt_offset щоб компенсувати свій GMT за лічені секунди. Після цього можна робити Time.now.zone щоб отримати свій код зони.


1 для відповіді № 2

Можна спробувати наступне:

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

або

p ActiveSupport::TimeZone[off_set].tzinfo.name # "America/Halifax"

0 для відповіді № 3

Оскільки 3-літерні коди недостатньо точні, користувачеві потрібно вказати повне ім'я з База даних часового поясу IANA.

Тоді ви можете використовувати Time.zone = "America/Halifax" (наприклад).
Time.zone.name повертає ім'я IANA та Time.zone.now повертає поточний час у вказаному часовому поясі.

Щоб програмно знайти часовий пояс у цьому форматі, можливо, ви зможете використовувати його /etc/timezone якщо вона доступна. Інші системи мають інші методи (якщо є навіть один).