Autore Topic: CDate non funziona  (Letto 619 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
CDate non funziona
« il: 28 Maggio 2018, 13:05:11 »
L'istruzione CDate non mi funziona più.
Citazione
Codice: [Seleziona]
Dim dData As Date
..............................................................
 dData = CDate($DtMM & "/" & $DtGG & "/" & $AADtCont)
Con Gambas 3.9:
Variabili locali:
     $DtMM  = "05"
     $DtGG = "28"
     $AADtCont = "2018"

dData = 28/05/2018 00:00:00


Con Gambas 3.10:
Variabili locali:
     $DtMM  = "05"
     $DtGG = "28"
     $AADtCont = "2018"

dData = 27/05/2018 22:00:00

Come si vede il campo dData, nella versione 3.10 contiene una data alterata di un giorno rispetto ai valori di partenza.

A parte il chiaro errore da segnalare, secondo me, ma io come posso fare per ottenere la data corretta?
 :(
:ciao:

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:CDate non funziona
« Risposta #1 il: 28 Maggio 2018, 14:35:33 »
L'istruzione CDate non mi funziona più.
...
A parte il chiaro errore da segnalare, secondo me, ma io come posso fare per ottenere la data corretta?

In effetti si trattava di un bug ma delle versioni precedenti, è stato riparato a partire dalla versione 7983 quindi la 3.9 ne era ancora affetta.
CDate assume l'ora UTC quindi differente di due ore per via dell'ora legale rispetto alla locale.
Ecco spiegata la differenza.
Devi usare CDate(Val("dataStringa")) se vuoi continuare a usare CDate.

Comunque l'uso delle date non è facile da capire, forse la cosa più semplice e corretta è quella di usare sempre funzioni UTC per poi localizzare solo al momento della visualizzazione all'utente.
Oltre a tutto con SQL conviene usare le date e non le stringhe, stavo preparando una esemplificazione di questo argomento con l'aiuto di Tornu ma poi mi ha dato buca  ;D

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.702
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:CDate non funziona
« Risposta #2 il: 28 Maggio 2018, 15:41:02 »
non è che c'entra questo?
https://gitlab.com/gambas/gambas/commit/e2a53d4a096d2d059888369e2b95b99252b50b9f
...la butto lì, non ho guardato con attenzione!
 :ciao:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:CDate non funziona
« Risposta #3 il: 28 Maggio 2018, 15:57:43 »
non è che c'entra questo?
https://gitlab.com/gambas/gambas/commit/e2a53d4a096d2d059888369e2b95b99252b50b9f
...la butto lì, non ho guardato con attenzione!
 :ciao:

No, non ha a che fare con CDate quello è un errore che riguarda la timezone su Time.

Comunque dimostra che anche i migliori quando hanno a che fare con date, tempo, fusi orari ecc. vanno facilmente in errore.  :)
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:CDate non funziona
« Risposta #4 il: 28 Maggio 2018, 16:05:31 »
Devi usare CDate(Val("dataStringa")) se vuoi continuare a usare CDate.

Perchè, quale altra soluzione suggeriresti?
 :(
:ciao:

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:CDate non funziona
« Risposta #5 il: 28 Maggio 2018, 17:10:41 »
Devi usare CDate(Val("dataStringa")) se vuoi continuare a usare CDate.

Perchè, quale altra soluzione suggeriresti?
 :(

Come ho detto cercherei di usare solo le date evitando l'uso delle stringhe, comunque questo codice sembra funzionare bene:
Codice: [Seleziona]
Public Sub Button1_Click()

  Dim m, g, a As String
  Dim dData As Date

  m = "05"
  g = "28"
  a = "2018"

  dData = CDate(Val(g &/ m &/ a))
  Print dData
  dData = Date(m &/ g &/ a)
  Print dData

End

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.300
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:CDate non funziona
« Risposta #6 il: 28 Maggio 2018, 21:21:41 »
Codice: [Seleziona]
  dData = Date(m &/ g &/ a)
Questa mi pare un'ottima soluzione.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re:CDate non funziona
« Risposta #7 il: 28 Maggio 2018, 22:49:00 »
...
Oltre a tutto con SQL conviene usare le date e non le stringhe, stavo preparando una esemplificazione di questo argomento con l'aiuto di Tornu ma poi mi ha dato buca  ;D

 :ciao:
E' vero, chiedo umilmente scusa a Gianluigi :-[, ma come ho avuto modo di dirvi in altre occasioni è un momento
(dura da un pò purtroppo) veramente complicato.
Comunque volevo dare un mio piccolo contributo al problema che spesso vedo sollevare sulla gestione delle date.
Vi assicuro che in tutti i progetti dove ho avuto a che fare con le date non ho mai avuto problemi nel gestirle, niente
di particolare, ma usando semplicemente le risorse messe a disposizione di Gambas, salvo il caso che qualcuno abbia
avuto esigenze particolari che io non ho incontrato, ma da quello che leggo sul Forum i problemi mi sono sempre sembrati
gli stessi. Nel 99% dei casi uso sempre l'oggetto DateBox che trovo comodissimo e non ho mai avuto l'esigenza di usare
per esempio oggetti di tipo testo da dover poi convertire o formattare con tutte le complicazioni che ne conseguono come
leggo spesso, questi i metodi che uso quasi sempre:
Data in un campo testo
Codice: [Seleziona]
Private $DataOdierna As Date

$DataOdierna = Date(Now)
TextLabel.Text = Format($DataOdierna, "dd/mm/yyyy")
Oggetto DateBox
Proprietà Mode impostata su DateOnly
Proprietà ReadOnly impostata su True se non si vuol dare all'utente la possibilità di digitare
la data ma obbligarlo a selezionarla dal calendario che viene visualizzando cliccando sulla piccola icona a
destra, nella maggior parte dei casi uso questa modalità; in caso contrario l'oggetto inserisce automaticamente
il carattere di separazione "/"
Premetto che io uso sempre nei miei progetti il database MySql con i campi data impostati come tipo Date
Inserimento nel DataBase senza nessuna formattazione
Codice: [Seleziona]
insResult["datatest"] = DateBox.Value
Lettura del campo dal DataBase senza nessuna formattazione
Codice: [Seleziona]
DateBox.Value = mioResult!datatest
Niente di che, ma con questi metodi non ho mai avuto "rogne"
Scusate la semplicità terra terra  :ciao:
« Ultima modifica: 28 Maggio 2018, 22:49:55 da tornu »
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:CDate non funziona
« Risposta #8 il: 28 Maggio 2018, 23:15:39 »
Caro, carissimo Tornu,
non ti devi scusare proprio di nulla, è evidente che non avevi tempo.
Quando potrai e se vorrai saremo sempre in tempo a farlo  :D

Tornando a bomba, sposo completamente quanto detto da te (ottima spiegazione  :ok: ).
Anche SQLite supporta i tipi data e tempo e non c'è motivo di introdurre possibili errori passando dal tipo string a quello data e viceversa.

 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro