Ruby date e tempo

r8
La data e l’ora del computer è disponibile, ecco:

t0

OK? Come si vede dipende dalle impostazioni locali, ma queste sono visualizzate (io sono a +2:00 rispetto a UTC).
Siccome in Ruby tutto è un oggetto Time.now crea una nuova istanza a Time:

t1

È possibile estrarre i singoli elementi dall’oggetto, ecco per la data:

t2

wday si riferisce al nome del giorno (weekday):

0   1   2   3   4   5   6
dom lun mar mer gio ven sab

e yday il numero di giorni dall’inizio dell’anno.

Per l’ora abbiamo:

t3

dove usec è il numero di microsecondi relativo alla creazione dell’istanza; torna utile per determinare intervalli di tempo. Notare che il simbolo per “micro” del SI (sistema internazionale) sarebbe μ ma quando questo non è disponibile si può usare u.
zone è il nome del fuso orario, quando disponibile, nel mio caso (Central Europe Saving Time), isdst ci dice se l’ora legale è attiva e utc? se stiamo usando l’ora di UTC.

t4

localtime restituisce l’ora locale, gmtime quella di UTC. Notare che GMT (Greenwich Mean Time) è il vecchio nome di UTC e non ci sono due “t” come verrebbe da pensare (Matz pasticcione!).

t5

getlocal è sinonimo di localtime come getutc di gmtime.
ctime è il formato del C, tipico di Unix. Attenzione che suppone errando che il tempo interno del computer sia UTC.
In un giorno ci sono 60 * 60 * 24 = 86400 secondi per cui ieri t avrebbe restituito l’ultima stringa.

Vediamo come possiamo calcolare l’intervallo di tempo tra due date, diciamo tra il 25 febbraio del 2010 e il 1° maggio dello stesso anno:

t6

Cioè abbiamo creato due oggetti per le rispettive date, fatto la loro differenza ottenendo il numero di secondi e diviso questo per il numero di secondi al giorno. Il risultato è approssimato ma rimediamo prima di subito con round. Non ci siamo dimenticati che _ è l’ultimo valore restituito dall’interprete, vero?; e che questo è disponibile in irb (di cui il nostro irq è un alias).

Volete sapere quanto siete vecchi? Ecco old.rb:

#!/usr/bin/ruby
# encoding: UTF-8

# old.rb

print "data di nascita (GG MM AAAA): "
bday = gets.chop
giorno, mese, anno = bday.split(' ')
ora = Time.now
nascita = Time.local(anno, mese, giorno)
seconds = ora - nascita
days = (seconds / 86400).round
puts "Sei vecchio di #{days} giorni"

old

OK, sono vecchio. Notare che

nascita = Time.local(anno, mese, giorno)

si può anche scrivere

t7

ma non

t8

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: