шукаю спосіб отримати власний часовий пояс, який яможе перейти до 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
якщо вона доступна. Інші системи мають інші методи (якщо є навіть один).