Conversione di DateTme in String con formattazione

sabato 25 giugno 2005 - 11.50

rubensoda Profilo | Newbie

Ho creato la seguente funzione :
(Vado a memoria, non ho il codice davanti in questo momento)

(Option Strict On)

Function data_ora (byVal date as Object,byVal formato as String )

if convert.toString(date).length = 0 or not isDate(date) then
return dbNull.Value
(o messaggio d'errore, ecc.)
end if

dim retDate as dateTime

select case formato

case is "d"
retDate = Format(convert.toDateTime(date),"dd/MM/yyyy"))
return retDate

case is "dt"
retDate = Format(convert.toDateTime(date),"dd/MM/yyyy HH:mm:ss"))
return retDate

End Select

End Function

Mettiamo che in ingresso abbia "31/12/1999" e che desideri in uscita il formato "d"

Ho quindi la necessità di convertire retDate in string
ma ottengo "31/12/1999 00:00:00" !!
Come posso mantenere la formattazione a shortdate ?

Cteniza Profilo | Guru

Verifica il metodo ToString che converte in stringa il valore dell'oggetto.
Questo assume dei parametri che ti permettono di gestire le diverse formattazioni.
Assomiglia molto ai parametri che venivano posti sulla funzione Format di Vb6

alextyx Profilo | Expert

Caro rubensoda, prova a impostare option strict a ON e ti accorgerai di un dettaglio che potrebbe cominciare a chiarire le cose. Se per esempio tu scrivessi:

Dim retdate As DateTime
Dim data As DateTime = Now
retdate = Format(Convert.ToDateTime(data), "dd/MM/yyyy")

Il compilatore ti segnalerebbe l'errore. Con option strict off, invece no!
Qual'è il problema che forse ti sta bloccando (premetto che non sono certo di aver capito cosa deve fare la tua funzione, proprio in virtù di quanto andrò ad esporre)?
Il problema è che il metodo Format restituisce una stringa, mentre il tuo retdate è dichiarato come tipo DateTime. Il compilatore con option strict off tenterà di operare un late binding, cioè una conversione 'al volo' dell'oggetto string in un oggetto DateTime. Con Option Strict ON, si rifiuta di compilare l'istruzione e ti segnala l'incongruenza. In queste conversioni 'nascoste' potresti perdere l'informazione che ti serve. Sia come sia, se ritorni un oggetto DateTime, devi poi riconvertirlo in stringa al momento della visualizzazione, imponendogli allora il formato desiderato. Forse la tua idea era quella di ritornare una stringa (la tua dichiarazione di funzione scritta a memoria non specifica la cosa), ma allora devi dichiarare RetDate come string. Penso che il tuo problema stia proprio in queste piccole 'confusioni' di oggetti. Fammi sapere e .... buon lavoro. Ciao :-)

rubensoda Profilo | Newbie

Grazie per la risposta alextyx

Se controlli bene il mio post ti accorgerai di un Option Strict On tra parentesi (il che significa che lavoro già con l'opzione Option Strict attiva..)
Pensavo fosse abbastanza chiaro cosa la "mia" funzione facesse.
- Accetta un object in ingresso
- Verifica che non sia di lunghezza zero e quindi che sia una data
- Fornisce in uscita l'object convertito in datetime nel formato specificato dal parametro 'formato'

Il problema è che ho esigenza di utilizzare la data in uscita convertita in string,
ma , una volta effettuata la conversione, penso in virtù del fatto che era originariamente un datetime,
mi ripropone la data in versione completa (dd/MM/yyyy HH:mm:ss) con 00:00:00 ovviamente al posto di ore,minuti,secondi. Vorrei semplicemente mantenere la formattazione a short date (dd/MM/yyyy)


Ho necessità che la funzione mi fornisca datetime quando devo passare valori a parametri (di stored procedures) definiti timestamp, mentre ho necessità di convertire l'uscita in string ad esempio, per aggiungere item ad una listview.
"Forse la tua idea era quella di ritornare una stringa (la tua dichiarazione di funzione scritta a memoria non specifica la cosa)" beh, l'ho chiaramente scritto in coda alla funzione :
"Ho quindi la necessità di convertire retDate in string "

Grazie comunque

alextyx Profilo | Expert

Può darsi ch'io prenda una cantonata, ovviamente, ma secondo me il problema resta quello che ti ho segnalato. Dovrei ripassarmi la teoria sugli oggetti datetime, tuttavia mi pare di ricordare che tu non possa tenerli formattati come tali, ma solo visualizarli in un formato specifico. Se tu torni con un tipo DateTime, la tua precednte formattazione non rimarrà memorizzata. Se tu torni con una stringa (insisto a chiederti qual'è il tipo di ritorno della tua funzione. Se è un DateTime, perchè non usi la variabile predefinita 'data_ora'?), torni con una stringa ottenuta da una conversione al momento dell'istruzione

return retdate

Se invece il tipo di ritorno è DateTime, allora non puoi mantenere alcuna formattazione. L'oggetto datetime ti si manifesterà con il formato che gli imporrai al momento della sua conversione in stringa. Quindi o ritorni una stringa, oppure questa funzione rimarrà solo codice sprecato. Almeno questo è quello che mi pare di ricordare dalla teoria, ma potrei sbagliare. A te il compito della verifica, caro Rubensoda! ;-)

Comunque con OptionStrict ON la seconda delle seguenti istruzioni:

Dim retDate As DateTime
retDate = Format(Convert.ToDateTime(Now), "dd/MM/yyyy")


Mi dà il seguente errore: Option strict ON non consente conversioni implicite da string a date

Sei sicuro al 100% di averlo abilitato?
Foprse è meglio che tu posti il codice originale. A volte sembra di ricordare le cose in un modo, ma poi risultano in un altro. Capita anche ai migliori. Incredibile ma vero: sia pur mooolto raramente, ma capita anche a me! :-)))

Cteniza Profilo | Guru

Alcuni punti:
- l'utilizzo di format (il vecchio format di vb) e di tutte le classi / metodi presenti sulla classe Microsoft.VisualBasic è sconsigliato e da evitare, Balena in uno dei suoi tips suggerisce addirittura di togliere Microsoft.VisualBasic dal template, nella fattispecie esiste ToString che può essere utilizzato al posto di Format
- se si tratta di textbox si può provvedere ai due eventi da collegare al binding Format e Parse (Attenzione che format è l'evento format e non il metodo format).

alextyx Profilo | Expert

In effetti, per ottenere il risultato di una datacorta, c'è, ad esempio, la possibilità di scrivere :
now.ToShortDateString()

Poi ci sono opzioni di formattazione a bizzeffe. Rimane il punto che CREDO che tutto questo venga deciso solo al momento della conversione in stringa dell'oggetto datetime, rendendo quindi inutile una funzione che ritorni l'oggetto datetime!
Vediamo cosa ci dirà rubensoda, dopo aver dato una ricontrollatina al listato. Nel frattempo, buona domenica a tutti! :-)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5