2011-10-10 18 views
9

in Rails 3.0.10Perché gli indici Rday Weekday sono diversi da quelli di Ruby?

ruby-1.9.2-p180 :010 > Time::DAYS_INTO_WEEK 
=> {:monday=>0, :tuesday=>1, :wednesday=>2, :thursday=>3, :friday=>4, :saturday=>5, :sunday=>6} 

E

ruby-1.9.2-p180 :011 > Date.today 
=> Mon, 10 Oct 2011 
ruby-1.9.2-p180 :012 > Date.today.wday 
=> 1 

Quindi, Lunedi è 0 nella mappatura tempo, e 1 nella mappatura Data.
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/calculations.rb

mi sento come iniziare con la Domenica come zero è il più sicuro, più comune, più probabilità di essere compreso da qualcun altro modo di fare le cose. Speravo di capire la storia/il ragionamento nel caso in cui trascuri qualcosa.

Il mio caso d'uso: sto memorizzando il giorno della settimana esplicitamente nel mio db. Immaginavo che memorizzare come un intero sarebbe più efficiente e più facile da utilizzare rispetto alla memorizzazione di "lunedì", "martedì", ecc.

PS Ho avuto la grande idea di fare qualcosa come il seguente. Mappa avanti e indietro dalle stringhe dei giorni feriali all'interno dei metodi (nascondendo il numero intero).

ruby-1.9.2-p180 :010 > Time::DAYS_INTO_WEEK 
=> {:monday=>0, :tuesday=>1, :wednesday=>2, :thursday=>3, :friday=>4, :saturday=>5, :sunday=>6} 
Time::DAYS_INTO_WEEK[day_of_week.downcase.to_sym] 
Time::DAYS_INTO_WEEK.to_a.select{|k, v| v == start_day }.first.first.to_s.capitalize 
+1

Non so perché gli indici sono come sono, ma eseguendo 'Date.today.wday' in' irb' e 'rails c' entrambi riportano lo stesso giorno della settimana (cioè 1 per lunedì). Stesso risultato con 'Time.now.wday'. Inoltre potresti trovare utile questa [informazione] (http://makandra.com/notes/1074-deal-with-different-ways-of-counting-weeks-and-weekdays-in-ruby). – Zabba

+0

Sei corretto. Il "problema" che ho è che esiste una mappatura accessibile che è incoerente. Speravo di usare un hash interno per la mia mappatura. (e grazie per il link) –

+0

E in binari sono in realtà costanti - http://api.rubyonrails.org/classes/Date.html Mi aspettavo di avere un'impostazione per il ritiro all'inizio della settimana. – Ninad

risposta

8

Non sono sicuro che ci sia una risposta assolutamente corretta a questa domanda. Penso che Zabba abbia preso in considerazione qualcosa riguardo alla differenza tra il numero di giorni delle settimane negli Stati Uniti/Canada e a livello internazionale.

Per quanto riguarda il ragionamento storico, sembra che David Heinemeier Hansson (DHH) ha rilasciato la seguente commettono il 21 febbraio 2005: https://github.com/rails/rails/commit/25f8a25c3ea107dcd0688307ac0ce19c4306f6b4

Il messaggio di commit afferma chiaramente che era intenzionale di fare all'inizio della settimana sia un Lunedi e non una domenica. Considerando che David è un opinionista, il creatore di Rails e che all'epoca viveva ancora in Danimarca, ha senso che ignorasse il fatto che le lezioni di Ruby's Date and Time considerano il giorno della domenica 0.

(più tardi commit 1c5a6944d38e6818d254f272057b513b038b2270 spostato days_into_week nella costante che vedi ora DAYS_INTO_WEEK; in seguito la stessa costante è stata aggiunta alla classe Date in commit bc1bcddede0c300e9c88f76a66a152814b734981).

+1

sì, mi chiedo perché il tempo di Ruby è domenica come 0 in wday. Voglio dire, per la maggior parte del mondo, il lunedì è il primo giorno della settimana. Questo è esasperante, perché il database con cui lavoriamo è impostato con lunedì come 0. – Dmitry

Problemi correlati