Để giải quyết múi giờ và thời gian tiết kiệm ánh sáng ban ngày, Ruby, giống như mọi thứ khác, là calling số localtime_r
C function. Điều này đặt thời gian trong một cấu trúc C gọi là tm
bao gồm một trường có tên là isdst
. Ruby đang đọc lá cờ đó.
localtime_r
tính isdst
trước bằng cách nhận múi giờ của bạn từ biến số toàn cầu tzname
. tzname
được xác định bằng cách gọi tzset
. Làm thế nào tzset
hiện công việc của nó phụ thuộc vào hệ thống. Nó có thể đến từ biến môi trường TZ, đọc một tập tin, hoặc truy vấn một dịch vụ hệ điều hành.
Ví dụ:
# Time zone from the system.
$ ruby -e 'puts Time.now.zone; puts Time.now.dst?'
PDT
true
# Time zone from the TZ environment variable.
$ TZ='Australia/Brisbane' ruby -e 'puts Time.now.zone; puts Time.now.dst?'
AEST
false
Một khi nó có múi giờ, localtime_r
có thể chuyển đổi từ GMT múi giờ mong muốn (sử dụng các quy tắc đó áp dụng vào ngày đó) bằng cách sử dụng "tz database" aka "tzdata" aka "zoneinfo" aka "cơ sở dữ liệu Olson "sau khi người sáng lập Arthur David Olson. Trước đây là một nỗ lực riêng tư, điều này hiện được duy trì bởi IANA. Đây là tập hợp các tệp được cài đặt trên hệ thống của bạn hoặc được giao với Ruby, chứa Far More Than Everything You Ever Want To Know About Time Zones and Daylight Savings.
Cơ sở dữ liệu tz treats daylight savings (and other weird things like War and Peace time) as just another time zone. Các bản ghi múi giờ được lưu giữ tất cả các con đường trở lại khi chúng ta có các múi giờ. Trước khi chúng tôi có múi giờ solar noon cho vị trí đó được sử dụng. Do các biến chứng lịch sử và múi giờ chuyển dịch này, cơ sở dữ liệu tz thích work with cities (such as "America/New York") và xác định múi giờ cho bạn.
time zone data files chứa nhận xét và nền tảng mở rộng, nếu bạn quan tâm đến lịch sử của lịch, chúng là một nội dung hấp dẫn.
Hmm, làm tốt lắm @Schwern, câu trả lời toàn diện tuyệt vời. Tìm kiếm cơ sở dữ liệu Olson khi chúng tôi nói chuyện trong khi cọ xát đùi của tôi trong niềm vui tại phông chữ mới này của kiến thức thời gian lịch sự của bạn và câu trả lời của bạn! :) – jbk