Tôi cần tính toán độ lệch, tính theo giờ, của một múi giờ nhất định từ UTC trong Ruby. Dòng mã này đã hoạt động cho tôi, hoặc vì vậy tôi nghĩ:Làm cách nào để tính toán độ lệch, tính theo giờ, của một múi giờ nhất định từ UTC trong ruby?
offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_offset).to_f/3600.0
Nhưng, hóa ra là trả lại cho tôi khoản bù chuẩn, chứ không phải khoản bù DST. Vì vậy, ví dụ, giả sử
self.timezone = "America/New_York"
Nếu tôi chạy dòng trên, offset_in_hours = -5, -4 không như mong muốn, cho rằng ngày hôm nay là 01 tháng 4, 2012.
Bất cứ ai có tư vấn cho tôi làm thế nào để tính toán offset_in_hours từ UTC cho một chuỗi hợp lệ TimeZone trong Ruby mà tài khoản cho cả thời gian tiêu chuẩn và tiết kiệm ánh sáng ban ngày?
Cảm ơn!
Cập nhật
Dưới đây là một số đầu ra từ IRB. Lưu ý rằng New York là 4 giờ sau UTC chứ không phải 5, vì tiết kiệm ánh sáng ban ngày:
>> require 'tzinfo'
=> false
>> timezone = "America/New_York"
=> "America/New_York"
>> offset_in_hours = TZInfo::Timezone.get(timezone).current_period.utc_offset/(60*60)
=> -5
>>
Điều này cho thấy rằng có một lỗi trong TZInfo hoặc nó không được DST-aware
Cập nhật 2
Mỗi nhận xét của joelparkerhender, lỗi trong mã trên là tôi đang sử dụng utc_offset, chứ không phải utc_total_offset.
Như vậy, mỗi câu hỏi ban đầu của tôi, dòng đúng mã là:
offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_total_offset).to_f/3600.0
Giúp tôi hiểu - nếu current_period được biết thông qua dst? rằng thời gian tiết kiệm ánh sáng ban ngày là hoạt động hoặc không hoạt động, thì tại sao current_period.offset không tính đến điều đó? Đây có phải là một lỗi? Cuối cùng, tôi biết về tất cả các phương pháp này trong TimeZone, mục tiêu của tôi là gán giá trị chính xác cho biến offset_in_hours – esilver
Vui lòng xem kết xuất của tôi ở trên, từ chạy irb - điều này cho thấy tzinfo không thực sự là dst-aware có một lỗi? – esilver
Không phải là lỗi - bạn chỉ cần tính đến dst. Tôi đã thêm thông tin vào câu trả lời về hai phương pháp khác cho thấy cách thực hiện. – joelparkerhenderson