2015-09-20 35 views
6

Forse una domanda stupida che dimostra la mia mancanza di comprensione dei fondamenti dell'ora legale, ma come per il titolo, in che modo Time.dst? sa se l'oggetto tempo è effettivamente vero o falso?Come funziona Ruby Time # dst?

Presumibilmente questo deve essere riconoscibile dalla combinazione di Data e Fuso orario, ma ciò non ha senso in quanto le latitudini inferiori nei fusi orari non utilizzano l'ora legale? Quindi sicuramente deve aver bisogno di una posizione per discernere #dst? ?

Cosa mi manca?

risposta

2

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.

+0

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