Per gestire i fusi orari e l'ora legale, Ruby, come quasi tutto il resto, è calling il localtime_r
C function. Ciò pone il tempo in una struttura C denominata tm
che include un campo denominato isdst
. Ruby sta leggendo quella bandiera.
localtime_r
calcola prima il fuso orario isdst
dalla variabile globale tzname
. tzname
viene determinato chiamando lo tzset
. In che modo tzset
il suo lavoro dipende dal sistema. Può provenire dalla variabile di ambiente TZ, dalla lettura di un file o dall'interrogazione di un servizio OS.
Ad esempio.
# 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
Una volta che si ha il fuso orario, localtime_r
può convertire da GMT al fuso orario desiderato (utilizzando le regole che si applicavano a quella data) utilizzando la "tz database" alias "tzdata" alias alias "database "zoneinfo" Olson "dopo il suo creatore Arthur David Olson. Precedentemente uno sforzo privato, questo è ora gestito da IANA. È un insieme di file installati sul sistema o forniti con Ruby, che contiene Far More Than Everything You Ever Want To Know About Time Zones and Daylight Savings.
Il database tz treats daylight savings (and other weird things like War and Peace time) as just another time zone. I record del fuso orario vengono fatti andare indietro fino a quando abbiamo avuto fusi orari. Prima avevamo i fusi orari solar noon per quella posizione. A causa di queste complicazioni storiche e dei fusi orari, il database tz preferisce work with cities (such as "America/New York") e determina il fuso orario per te.
Il time zone data files contiene un ampio commento e sfondo, se sei interessato alla cronologia del calendario sono una lettura affascinante.
Hmm, ottimo lavoro @Schwern, ottima risposta completa. Osservando il database di Olson mentre parliamo mentre sfregamento le mie cosce in allegria con questo nuovo font di conoscenza del tempo, per gentile concessione di te e della tua risposta! :) – jbk