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.