Gestione data & ora (tempo)
C'è molta confusione tra tutti gli utenti, non solo i neofiti, su come utilizzare correttamente il tipo di dati
Data (Date) in Gambas. Questa pagina proverà a chiarirlo.
Le date non sono stringhe
La confusione deriva principalmente dal fatto che stai pensando alle date usando la loro
rappresentazione sotto forma di stringa in locale, ovvero come se il tipo di dati Date rappresentasse una data in locale. Grosso errore!
Internamente, Gambas memorizza un valore Date in Universal Time (anche noto come
UTC
), usando due numeri interi a 32 bit:
-
Il primo numero intero è un numero di giorni trascorsi da un'epoca specifica, ovvero il 1 gennaio 4801 a.C. È la parte della data.
-
Il secondo numero intero è un numero di millisecondi dalla mezzanotte. È la parte del tempo.
Ma in Gambas non c'è modo di scrivere direttamente una costante Date. Devi sempre usare la funzione
Date
che crea una data o converte una rappresentazione sotto forma di stringa della data usando
CStr
,
CDate
,
Str$
o
Val
.
Di conseguenza, ogni volta che manipoli una rappresentazione della data, Gambas deve decidere se la tua rappresentazione della data è in U.T.C. o nell'ora locale. In altre parole, il fuso orario associato a una rappresentazione della data è implicito.
È un po come il problema dei set di caratteri di stringa: il set di caratteri di una stringa è implicito. Non è memorizzato con la stringa.
Le funzioni di Gambas presuppongono che una rappresentazione della data sia:
-
In U.T.C., utilizzando un formato data americano
-
Nell'ora locale, ovvero nel fuso orario specificato dalla proprietà System.TimeZone, che viene direttamente dalla configurazione del sistema corrente. Il formato della data è il formato della data locale.
Il fuso orario dipende da ciò che è configurato nel sistema. Il formato della data dipende dalla lingua corrente specificata dalla proprietà
System.Language.
Ecco l'elenco delle funzioni relative alla data e se si occupano di U.T.C. o ora locale.
Funzioni che si occupano di U.T.C. e formato data americano
CDate
|
Converte un'espressione in un valore di data & ora (tempo).
|
CStr
|
Converte un valore di data & ora in una stringa.
|
Queste funzioni vengono utilizzate dall'interprete durante la conversione implicita del tipo di dati.
Funzioni che si occupano dell'ora (tempo) locale
Date
|
Restituisce una data senza il suo componente orario o crea un valore di data e ora dai suoi componenti nell'ora locale.
|
DateAdd
|
Aggiunge un periodo a una determinata data.
|
DateDiff
|
Restituisce il periodo tra due date.
|
Day
|
Restituisce il giorno di un valore Date
|
Hour
|
Restituisce le ore di un valore Date.
|
Minute
|
Restituisce i minuti di un valore Date.
|
Month
|
Restituisce il mese di un valore Date.
|
Second
|
Restituisce i secondi di un valore Date.
|
Str$
|
Converte un valore di data & ora in una stringa.
|
Time
|
Restituisce la parte temporale di un valore Date o crea un valore temporale dai suoi componenti.
|
Val
|
Converte una stringa in un valore di data & ora, a condizione che la stringa rappresenti una data nel formato di data e ora locale.
|
Week
|
Restituisce il numero della settimana di un valore Date.
|
WeekDay
|
Restituisce il giorno della settimana di un valore Date.
|
Year
|
Restituisce l'anno di un valore Date.
|
Conversione implicita
Fai attenzione alla conversione implicita tra date e stringhe!
-
PRINT stampa una data utilizzando il metodo
Str$
. Quindi la data viene stampata nell'ora locale.
-
Tutte le altre conversioni implicite utilizzano le funzioni
CStr
e CDate
, presupponendo il tempo U.T.C.
CStr
e
CDate
intendono essere reciproci. Significa che
CStr(CDate(SomeString)) = SomeString
e
CDate(CStr(SomeDate)) = SomeDate
dovrebbero risultare sempre vere.
Le date sono numeri
Un valore di data e ora viene convertito implicitamente in un numero in virgola mobile la cui parte intera è la parte di data interna (il numero di giorni dal 1 ° gennaio 4400 a.C.) e la parte frazionaria la parte di tempo interno.
Di conseguenza, puoi facilmente eseguire l'aritmetica diurna tra le date usando gli operatori
+
e
-
standard.
Per quanto riguarda la parte frazionaria, devi stare attento che sei nel tempo U.T.C. e che una parte frazionaria zero significa mezzanotte nel tempo U.T.C.
Di conseguenza, se il fuso orario non è nullo,
CFloat(Date(Now))
non restituirà un numero intero!
Date nulle e date in solo-tempo
Le date di solo-tempo sono il valore di data e ora in cui solo la parte della data è zero. In quel caso speciale, il fuso orario non viene preso in considerazione. Questo è utile quando vuoi fare l'aritmetica con i tempi.
Le date nulle sono valori di data e tempo in cui sia la data che il tempo corrispondono a zero. Sono equivalenti alla costante
NULL
. Fare l'aritmetica con date nulle genera un errore.
Le date nei database
Da fare.