Calendario in ruby

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


Prima revisione: Il programma che segue è una traduzione in italiano di GoodFriday.rb Proporrei di chiamarlo Calendario.rb Se ci mettiamo l’anno dopo il nome ovviamente ci calcolerà la Santa Pasqua per l’anno indicato.

Sto cercando il calcolo della Pasqua ebraica o di altre date particolari come la domenica d’inizio e fine dell’ora legale, da aggiungere a queste poche righe di programma.

Mi piacerebbe sapere se con lo stesso sito si potesse creare uno spazio per uploadare frammenti di codice. Ciao, Francesco Stilo

Ecco le righe di codice da copiare e salvare con un editor di testo come : calendario.rb

(o usate il comodo link in alto a destra “scarica i sorgenti nella pagina”)

OK ho capito.

Ho aggiunto alcune personalizzazioni come il nome del mese o del giorno in italiano anche in forma abbreviata. Questi non sono altro che array che sulla mia macchina li ho inserito nel file date.rb che si trova in C:\ruby\lib\ruby\1.8\ per semplificare adesso li ho inseriti in questo stesso programma ma volendo sarebbe meglio copiarli in date.rb ovviamente eliminandoli dal file Calendario.rb.

#! /usr/bin/env ruby

# goodfriday.rb: Written by Tadayoshi Funaba 1998, 2000, 2002
# $Id: goodfriday.rb,v 1.1 1998-03-08 18:44:44+09 tadf Exp $
# tradotto e aggiornato in italiano da Francesco Stilo

require 'date'

  # I nomi dei mesi e dei giorni, in Italiano

  # I nomi dei mesi, in Italiano.  I Mesi  si contano da 1 to 12; 
  # un indice numerico dei mesi rappresentato in questo array
  # ci da il nome del mese (hence il primo elemento è nullo).
  # Il nome dei mesi (hence il  primo elemento è nil).
  MESINAMES = [nil] + %w(Gennaio Febbraio Marzo Aprile Maggio Giugno
              Luglio Agosto Settembre Ottobre Novembre Dicembre)

  # Nomi dei Mesi abbreviati in Italiano.
  ABBR_MESINAMES = [nil] + %w(Gen Feb Mar Apr Mag Giu
                        Lug Ago Set Ott Nov Dic)

  # Il nome dei giorni della settimana, in Italiano.  I giorni della settimana
  # si contano da 0 a 6 (eccetto nella settimana commerciale); una 
  # rappresentazione numerica del giorno in questo array ci da il nome del giorno.

  # Il nome del giorno in Italiano.
  GIORNINAMES = %w(Domenica Lunedi Martedi Mercoledi Giovedi Venerdi Sabato)

  # Abbreviati : Nomi dei Giorni, in Italiano.
  ABBR_GIORNINAMES = %w(Dom Lun Mar Mer Gio Ven Sab)

def easter(y)
  g = (y % 19) + 1      # il resto dell’ anno diviso 19 
  c = (y / 100) + 1     # anno diviso 100 
  x = (3 * c / 4) - 12  
  z = ((8 * c + 5) / 25) - 5
  d = (5 * y / 4) - x - 10
  e = (11 * g + 20 + z - x) % 30
  e += 1 if e == 25 and g > 11 or e == 24
  n = 44 - e
  n += 30 if n < 21
  n = n + 7 - ((d + n) % 7)
  if n <= 31 then [y, 3, n] else [y, 4, n - 31] end
end

 # calcola la domenica tra prima data d1, seconda data d2 e 
 #  d3=0 la prima  settimana del mese
 #  d3=1 indica la seconda settimana del mese 
   def print_sundays(d1, d2, d3)
         d1 +=1 while (d1.wday != 0)
         d1.step(d2, 7) do |date|
             puts "#{date.day + (d3*7)} #{Date::MESINAMES[date.mon]}" 
         end
     end

# calcola il nome del giorno della settimana abbreviato
  def Abb_name_of_week(date)
    Date::ABBR_GIORNINAMES[date.wday]
  end

# la variabile ba legge l'eventuale argomento passato quando si scrive il nome del file c:\calendario.rb 2006
ba = ARGV[0]

if not (ba) then  ba = Date::today().year.to_i 
    else
    ba = ba.to_i
end

es = Date.new(*easter(ba))

puts "" 
puts "Festivita dipendenti dalla Santa Pasqua" 
puts "" 
puts "" 

[[-9*7, 'Settima Domenica'],
 [-8*7, 'Sesta Domenica'],
 [-7*7, 'Quinta Domenica di Quaresima (Domenica di Carnevale)'],
 [-48,  'Lunedi grasso'],
 [-47,  'Martedi grasso o di Carnevale'],
 [-46,  'Mercoledi delle Ceneri'],
 [-6*7, 'Quarta Domenica di Quaresima'],
 [-3*7, 'Mothering Sunday'],
 [-2*7, 'Domenica di Passione'],
 [-7,   'Domenica delle Palme'],
 [-3,   'I sepolcri'],
 [-2,   'Venerdi Santo'],
 [-1,   'Vigilia di Pasqua'],
 [0,    'PASQUA '],
 [1,    'Lunedi di Pasqua o in Albis'],
 [7,    'Domenica dopo Pasqua'],
 [5*7,  'Rogation Sunday'],
 [39,   'Giorno dell Ascensione '],
 [42,   'Domenica dopo l Ascensione '],
 [7*7,  'Pentecoste '],
 [50,   'Whitmonday'],
 [8*7,  'Domenica Trinita '],
 [60,   'Corpus Domini ']].

each do |xs|
    dd = (es + xs.shift)
    printf "%03s  %02d.%02d.%04d : ",  Abb_name_of_week(dd), dd.day, dd.month, dd.year 
    printf '  ' + xs.shift + "\n" 
end

puts "" 
puts "" 
puts "Festivita con data fissa" 
puts "" 
[['1', '1', 'Capodanno'],
 ['1', '6', 'Befana'],
 ['1', '15', 'San Mauro'],
 ['3', '19', 'Festa del Papa'],
 ['6', '29', 'San Pietro e Paolo'],
 ['8', '15', 'Festa dell Assunta'],
 ['10', '4', 'San Francesco'],
 ['11', '2', 'Tutti i Santi'],
 ['12', '8', 'Festa dell Immacolata'],
 ['12', '25', 'Santo Natale'],
 ['12', '31', 'Ultimo dell anno'],

].

each do |xs|

    dd = Date.new(ba.to_i, xs.shift.to_i, xs.shift.to_i)
      printf "%03s  %02d.%02d.%04d : ",  Abb_name_of_week(dd), dd.day, dd.month, dd.year 
     printf '  ' + xs.shift + "\n" 
end

puts "" 
print "L'ora legale incomincia l'ultima domenica di marzo       : "     
print_sundays(Date::civil(ba, 3, 24), Date::civil(ba, 3, 31), 0)

puts "" 
print "L'ora legale finisce con l'ultima domenica di ottobre    : "     
print_sundays(Date::civil(ba, 10, 24), Date::civil(ba, 10, 31), 0)

puts "" 
print "La Festa della Mamma, seconda domenica di Maggio,  e'    : "     
print_sundays(Date::civil(ba, 5, 1), Date::civil(ba, 5, 7), 1)

puts "" 
print "La Festa di San Mauro, seconda domenica di Luglio, e'     : "     
print_sundays(Date::civil(ba, 7, 1), Date::civil(ba, 7, 7), 1)

puts "" 
puts "" 
puts "Se vuoi cambiare l'anno scrivi il nome del file 'Calendario.rb' e poi l'anno 'aaaa'" 
puts "cosi' le FESTE saranno calcolate sull'anno indicato." 
puts "" 

Updated on October 23, 2006 00:48 by Ruby Fan (85.18.14.45)