2015-09-20 20 views
6

Có lẽ một câu hỏi về daft thể hiện sự thiếu hiểu biết của tôi về nguyên tắc cơ bản về tiết kiệm ánh sáng ban ngày, nhưng theo tiêu đề, làm thế nào để Time.dst? biết liệu đối tượng thời gian thực sự là đúng hay sai?Ruby Time # dst như thế nào?

Có lẽ điều này phải rõ ràng bởi sự kết hợp của ngày và múi giờ, nhưng sau đó điều đó không có ý nghĩa vì vĩ độ thấp hơn trong múi giờ không sử dụng tiết kiệm ánh sáng ban ngày? Do đó chắc chắn nó phải cần vị trí để phân biệt #dst? ?

Tôi đang thiếu gì?

Trả lời

2

Để 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.

+0

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

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