2012-04-01 37 views
24

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 

Trả lời

52

Có, sử dụng TZInfo như thế này:

require 'tzinfo' 
tz = TZInfo::Timezone.get('America/Los_Angeles') 

Để có được giai đoạn hiện nay:

current = tz.current_period 

Để tìm hiểu xem thời gian tiết kiệm ánh sáng ban ngày có đang hoạt động hay không:

current.dst? 
#=> true 

Để cơ sở bù đắp của múi giờ từ UTC chỉ trong vài giây:

current.utc_offset 
#=> -28800 which is -8 hours; this does NOT include daylight savings 

Để có được các khoản tiết kiệm ánh sáng ban ngày bù đắp từ thời gian tiêu chuẩn:

current.std_offset 
#=> 3600 which is 1 hour; this is because right now we're in daylight savings 

Để tổng số bù đắp từ UTC:

current.utc_total_offset 
#=> -25200 which is -7 hours 

Tổng chênh lệch từ UTC bằng utc_offset + std_offset.

Đây là mức chênh lệch so với giờ địa phương nơi tiết kiệm ánh sáng ban ngày có hiệu lực, tính bằng giây.

+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

+0

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

+0

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

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