2012-03-10 50 views
21

Trong ứng dụng Rails 3.x tôi cần hiển thị chữ viết tắt múi giờ (EST, PST, CST, v.v.) thay vì tên múi giờ đầy đủ. Tôi đã nhìn thấy một số cuộc thảo luận dường như giải quyết vấn đề, nhưng trong cách cư xử quá dài dòng.Làm cách nào để dịch tên đầy đủ của múi giờ sang chữ viết tắt tz?

Có đá quý hoặc phương pháp rất súc tích để xử lý việc này có thể được sử dụng để ánh xạ chúng đúng cách không?

Trả lời

28

Đối với múi giờ hiện tại:

Time.zone.now.strftime('%Z') 

Hoặc cho một danh sách các múi giờ:

ActiveSupport::TimeZone.us_zones.map do |zone| 
    Time.now.in_time_zone(zone).strftime('%Z') 
end 

Nó hoạt động, nhưng nó vẫn có vẻ như phải có cách tốt hơn ...

+1

Hãy cho tôi biết nếu bạn tìm thấy giải pháp tốt hơn nữa. Cám ơn vì đã chia sẻ. – ylluminate

+0

Điều này chắc chắn sẽ không thành công trong trường hợp sau 2.2.2: 059> Time.now.in_time_zone ("Indiana (Đông)"). Strftime ('% Z') => "EDT" 2.2.2: 060> Thời gian .now.in_time_zone ("Giờ Miền Đông (Hoa Kỳ & Canada)") strftime ('% Z') => "EDT" – AMBasra

2

Vâng, nếu bạn cho phép người dùng chọn múi giờ của riêng mình, bạn có thể hiển thị từ viết tắt múi giờ như một phần của định dạng ngày giờ. Hãy thử một cái gì đó như thế này trong bạn appliction_helper.rb, sau đó sử dụng nó trong một cái nhìn để định dạng một đối tượng datetime:

def format_datetime(datetime) 
    datetime.strftime "%-d %b %Y, %H:%M %Z" 
end 

Cập nhật

Nếu bạn đang làm geolocation dựa trên người dùng địa chỉ IP, sau đó bạn có thể thực hiện tra cứu múi giờ dựa trên vị trí đó. Câu hỏi này đã thực sự được hỏi trước đây nhưng liên quan đến vĩ độ/kinh độ hơn là tên của múi giờ đã cho.

Có một chi của một này: Timezone lookup from latitude longitude

+0

Tôi kéo trong múi giờ qua họ ip + geolocation phát hiện vì vậy tôi đang giải quyết nó từ tên dài hơn. – ylluminate

+0

Thực ra câu hỏi của tôi cụ thể hơn một chút. Tôi có vị trí địa lý hoạt động tốt. Vấn đề cho đến nay là kết quả là phiên bản dài hơn của múi giờ. Tôi đang tìm kiếm EST (EDT), PST (PDT), UTC, IST, v.v. – ylluminate

5
Time.now.zone 
# => "UTC" 

Để sử dụng múi giờ mặc định (nếu thiết lập), bạn có thể sử dụng:

Time.zone.now.zone 
# => "CDT" 

Thông tin thêm về rằng: http://api.rubyonrails.org/classes/Time.html#method-c-zone-3D

+0

Điều này cũng sẽ không thành công trong trường hợp sau Time.now.in_time_zone ("Giờ Miền Đông (Hoa Kỳ & Canada)").vùng => "EDT" 2.2.2: 065> Time.now.in_time_zone ("Indiana (Đông)"). => "EDT" Tiết kiệm ánh sáng ban ngày cho các khu vực có cùng thời gian cho ví dụ nêu trên cả hai khu vực là GMT -5. Vì vậy, ruby ​​là nhầm lẫn. – AMBasra

4

Tôi nhìn qua tất cả cho câu trả lời này, và cuối cùng tôi đã tìm thấy những gì tôi đang tìm kiếm. Tôi để lại câu trả lời ở đây để những người khác có thể không phải nhìn gần như dài và cứng như tôi đã phải.

Nếu bạn có quyền truy cập vào ActiveSupport và đối phó với các đối tượng TimeZone như thế này:

timezone = ActiveSupport::TimeZone.all[44] 

sau đó bạn có thể nhận được để chữ viết tắt theo cách này:

timezone.tzinfo.current_period.abbreviation 
+0

thông tin vùng nằm trong tzinfo, tuy nhiên, về cơ bản đây là cách đơn giản hơn để thực hiện những gì ifightcrime đã đề cập ở trên ... Ví dụ: User.take.created_at.zone – hellion

+0

Bạn cũng có thể sử dụng 'strftime' để lấy chữ viết tắt trực tiếp từ Ví dụ 'TZInfo :: TimezoneProxy'. – roflmyeggo

Các vấn đề liên quan