Newsgroup: it.comp.lang.visual-basic
Titolo: [HELP] Formattazione data e viceversa

Ciao a tutti,
per formattare una data come si vuole esiste la comodissima funzione
strData = format(date, "yyyy/mm/dd")
che trasforma la data nel formato che io voglio.
Mi chiedevo se esite la funziona inversa... voglio dire, se ho una
stringa contenente la data in un formato noto (per esempio
"yyyy/mm/dd") come posso trasformarla in un tipo "date" (o comunque un
formato standard utilizzabile per esempio con la DateDiff?
Grazie a tutti per le risposte (spero...)
Ciao
Rusko

 formato standard utilizzabile per esempio con la DateDiff?
... CDate?...
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Grazie a tutti per le risposte (spero...)
Dai un occhio a:
DateSerial()
e
CDate()
Dim miadata as date
miadata=dateserial(2006,5,23)
-- 
DBMS Firebird
VB6 + Ado

 ha scritto nel messaggio

No, in VB6 non esiste una funzione "inversa" della format.
Se il tuo formato è sempre yyyy/mm/dd allora la semplice CDate funziona 
benissimo, altrimenti realizzare un parser su un formato personalizzato non 
è così semplice.
Ciao 

 CDate()
non e' esattamente quello che cercavo... il mio problema e' un po'
diverso...
se la data (date) e' #1/2/2006# (2 gennaio) e la formatto in
"dd/mm/yyyy" con:
format(date, "dd/mm/yyyy")
ottengo la stringa "02/01/2006".
Quello che a me serve e' una funzione che prendendo la stringa
"02/01/2006" ed il "formato di formattazione" della stessa, mi ritorni
una data (di tipo date). Qualcosa come
ScanDate("02/01/2006", "dd/mm/yyyy") che ritorni #1/2/2006#.
Esiste qualcosa del genere? Il mio problema e' che vorrei fare qualcosa
di flessibile che funzioni con qualunque formato ("mm/dd/yyyy",
"yy/m/d", "d/m/yyyy"......); farmi da solo l'interpretazione della
stringa e' un po' complesso....
Grazie lo stesso!
Rusko

 è così semplice.
quello che temevo... vorrei evitare di farmi il parsing a mano, non
esiste proprio un oggetto (un calendario magari) o una api di windows
che fa questo lavoro?
Grazie lo stesso!
Ciao
Rusko

 che fa questo lavoro?
Non credo, perň puoi prendere spunto da come fa .Net, sempre che sia 
comprensibile :)
Per eventuali approfondimenti ti rimando a Reflector su 
DateTime.ParseByFormat del Fw2.0
Ciao
--
Private Shared Function ParseByFormat(ByRef str As __DTString, ByRef format 
As __DTString, ByRef parseInfo As ParsingInfo, ByVal dtfi As 
DateTimeFormatInfo, ByRef result As DateTimeResult) As Boolean
      Dim flag1 As Boolean
      Dim num1 As Integer = 0
      Dim num2 As Integer = 0
      Dim num3 As Integer = 0
      Dim num4 As Integer = 0
      Dim num5 As Integer = 0
      Dim num6 As Integer = 0
      Dim num7 As Integer = 0
      Dim num8 As Integer = 0
      Dim num9 As Double = 0
      Dim tm1 As TM = 
TM.AM
      Dim ch1 As Char = format.GetChar
      Select Case ch1
            Case "s"c
                  num1 = format.GetRepeatCount
                  If Not DateTimeParse.ParseDigits(str, IIf((num1 < 2), 1, 
2), num8) Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  If Not DateTimeParse.CheckNewValue(result.Second, num8, 
ch1, result) Then
                        Return False
                  End If
                  goto Label_09C5
            Case "t"c
                  num1 = format.GetRepeatCount
                  If (num1 = 1) Then
                        If Not DateTimeParse.MatchAbbreviatedTimeMark(str, 
dtfi, tm1) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                        goto Label_04DE
                  End If
                  If Not DateTimeParse.MatchTimeMark(str, dtfi, tm1) Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  goto Label_04DE
            Case "m"c
                  num1 = format.GetRepeatCount
                  If Not DateTimeParse.ParseDigits(str, IIf((num1 < 2), 1, 
2), num7) Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  If Not DateTimeParse.CheckNewValue(result.Minute, num7, 
ch1, result) Then
                        Return False
                  End If
                  goto Label_09C5
            Case "y"c
                  num1 = format.GetRepeatCount
                  If Not dtfi.HasForceTwoDigitYears Then
                        If (num1 <= 2) Then
                              parseInfo.fUseTwoDigitYear = True
                        End If
                        flag1 = DateTimeParse.ParseDigits(str, num1, num2)
                        Exit
                  End If
                  flag1 = DateTimeParse.ParseDigits(str, 1, 4, num2)
                  Exit
            Case "z"c
                  num1 = format.GetRepeatCount
                  Dim span1 As New TimeSpan(CLng(0))
                  If Not DateTimeParse.ParseTimeZoneOffset(str, num1, span1) 
Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  If (((result.flags And ParseFlags.TimeZoneUsed) <> 
DirectCast(0, ParseFlags)) AndAlso (span1 <> result.timeZoneOffset)) Then
                        result.SetFailure(ParseFailureKind.FormatWithParameter, 
"Format_RepeatDateTimePattern", "z"c)
                        Return False
                  End If
                  result.timeZoneOffset = span1
                  result.flags = (result.flags Or ParseFlags.TimeZoneUsed)
                  goto Label_09C5
            Case "K"c
                  If str.Match("Z"c) Then
                        If (((result.flags And ParseFlags.TimeZoneUsed) <> 
DirectCast(0, ParseFlags)) AndAlso (result.timeZoneOffset <> TimeSpan.Zero)) 
Then
                              result.SetFailure(ParseFailureKind.FormatWithParameter, 
"Format_RepeatDateTimePattern", "K"c)
                              Return False
                        End If
                        result.flags = (result.flags Or 
ParseFlags.TimeZoneUsed)
                        result.timeZoneOffset = New TimeSpan(CLng(0))
                        result.flags = (result.flags Or 
ParseFlags.TimeZoneUtc)
                        goto Label_09C5
                  End If
                  If (str.Match("+"c) OrElse str.Match("-"c)) Then
                        str.Index -= 1
                        Dim span2 As New TimeSpan(CLng(0))
                        If Not DateTimeParse.ParseTimeZoneOffset(str, 3, 
span2) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                        If (((result.flags And ParseFlags.TimeZoneUsed) <> 
DirectCast(0, ParseFlags)) AndAlso (span2 <> result.timeZoneOffset)) Then
                              result.SetFailure(ParseFailureKind.FormatWithParameter, 
"Format_RepeatDateTimePattern", "K"c)
                              Return False
                        End If
                        result.timeZoneOffset = span2
                        result.flags = (result.flags Or 
ParseFlags.TimeZoneUsed)
                  End If
                  goto Label_09C5
            Case "L"c, "["c, "e"c, "G"c, "&"c
                  goto Label_08FC
            Case "M"c
                  num1 = format.GetRepeatCount
                  If (num1 <= 2) Then
                        If (Not DateTimeParse.ParseDigits(str, num1, num3) 
AndAlso (Not parseInfo.fCustomNumberParser OrElse Not 
parseInfo.parseNumberDelegate.Invoke(str, num1, num3))) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                        goto Label_0223
                  End If
                  If (num1 = 3) Then
                        If Not DateTimeParse.MatchAbbreviatedMonthName(str, 
dtfi, num3) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                  ElseIf Not DateTimeParse.MatchMonthName(str, dtfi, num3) 
Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  result.flags = (result.flags Or 
ParseFlags.ParsedMonthName)
                  goto Label_0223
            Case "Z"c
                  If (((result.flags And ParseFlags.TimeZoneUsed) <> 
DirectCast(0, ParseFlags)) AndAlso (result.timeZoneOffset <> TimeSpan.Zero)) 
Then
                        result.SetFailure(ParseFailureKind.FormatWithParameter, 
"Format_RepeatDateTimePattern", "Z"c)
                        Return False
                  End If
                  result.flags = (result.flags Or ParseFlags.TimeZoneUsed)
                  result.timeZoneOffset = New TimeSpan(CLng(0))
                  result.flags = (result.flags Or ParseFlags.TimeZoneUtc)
                  str.Index += 1
                  If Not DateTimeParse.GetTimeZoneName(str) Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  str.Index -= 1
                  goto Label_09C5
            Case "\"c
                  If format.GetNext Then
                        If Not str.Match(format.GetChar) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                        goto Label_09C5
                  End If
                  result.SetFailure(ParseFailureKind.Format, 
"Format_BadFormatSpecifier", Nothing)
                  Return False
            Case "d"c
                  num1 = format.GetRepeatCount
                  If (num1 <= 2) Then
                        If (Not DateTimeParse.ParseDigits(str, num1, num4) 
AndAlso (Not parseInfo.fCustomNumberParser OrElse Not 
parseInfo.parseNumberDelegate.Invoke(str, num1, num4))) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                        If Not DateTimeParse.CheckNewValue(result.Day, num4, 
ch1, result) Then
                              Return False
                        End If
                        goto Label_09C5
                  End If
                  If (num1 = 3) Then
                        If Not DateTimeParse.MatchAbbreviatedDayName(str, 
dtfi, num5) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                  ElseIf Not DateTimeParse.MatchDayName(str, dtfi, num5) 
Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  If Not DateTimeParse.CheckNewValue(parseInfo.dayOfWeek, 
num5, ch1, result) Then
                        Return False
                  End If
                  goto Label_09C5
            Case "f"c, "F"c
                  num1 = format.GetRepeatCount
                  If (num1 <= 7) Then
                        If (Not DateTimeParse.ParseFractionExact(str, num1, 
num9) AndAlso (ch1 = "f"c)) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                        If (result.fraction < 0) Then
                              result.fraction = num9
                              goto Label_09C5
                        End If
                        If (num9 <> result.fraction) Then
                              result.SetFailure(ParseFailureKind.FormatWithParameter, 
"Format_RepeatDateTimePattern", ch1)
                              Return False
                        End If
                        goto Label_09C5
                  End If
                  result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                  Return False
            Case "g"c
                  num1 = format.GetRepeatCount
                  If Not DateTimeParse.MatchEraName(str, dtfi, result.era) 
Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  goto Label_09C5
            Case "h"c
                  parseInfo.fUseHour12 = True
                  num1 = format.GetRepeatCount
                  If Not DateTimeParse.ParseDigits(str, IIf((num1 < 2), 1, 
2), num6) Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  If Not DateTimeParse.CheckNewValue(result.Hour, num6, ch1, 
result) Then
                        Return False
                  End If
                  goto Label_09C5
            Case "."c
                  If Not str.Match(ch1) Then
                        If (Not format.GetNext OrElse Not 
format.Match("F"c)) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                        format.GetRepeatCount
                  End If
                  goto Label_09C5
            Case "/"c
                  If Not str.Match(dtfi.DateSeparator) Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  goto Label_09C5
            Case ":"c
                  If Not str.Match(dtfi.TimeSeparator) Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  goto Label_09C5
            Case "H"c
                  num1 = format.GetRepeatCount
                  If Not DateTimeParse.ParseDigits(str, IIf((num1 < 2), 1, 
2), num6) Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                        Return False
                  End If
                  If Not DateTimeParse.CheckNewValue(result.Hour, num6, ch1, 
result) Then
                        Return False
                  End If
                  goto Label_09C5
            Case "%"c
                  If ((format.Index >= (format.Value.Length - 1)) OrElse 
(format.Value.Chars((format.Index + 1)) = "%"c)) Then
                        result.SetFailure(ParseFailureKind.Format, 
"Format_BadFormatSpecifier", Nothing)
                        Return False
                  End If
                  goto Label_09C5
            Case "'"c, """"c
                  Dim builder1 As New StringBuilder
                  If Not DateTimeParse.TryParseQuoteString(format.Value, 
format.Index, builder1, num1) Then
                        result.SetFailure(ParseFailureKind.FormatWithParameter, 
"Format_BadQuote", ch1)
                        Return False
                  End If
                  format.Index = (format.Index + (num1 - 1))
                  Dim text1 As String = builder1.ToString
                  Dim num10 As Integer = 0
                  Do While (num10 < text1.Length)
                        If ((text1.Chars(num10) = " "c) AndAlso 
parseInfo.fAllowInnerWhite) Then
                              str.SkipWhiteSpaces
                        ElseIf Not str.Match(text1.Chars(num10)) Then
                              result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                              Return False
                        End If
                        num10 += 1
                  Loop
                  goto Label_09C5
            Case Else
                  goto Label_08FC
      End Select
      If (Not flag1 AndAlso parseInfo.fCustomNumberParser) Then
            flag1 = parseInfo.parseNumberDelegate.Invoke(str, num1, num2)
      End If
      If Not flag1 Then
            result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", 
Nothing)
            Return False
      End If
      If DateTimeParse.CheckNewValue(result.Year, num2, ch1, result) Then
            goto Label_09C5
      End If
      Return False
Label_0223:
      If DateTimeParse.CheckNewValue(result.Month, num3, ch1, result) Then
            goto Label_09C5
      End If
      Return False
Label_04DE:
      If (parseInfo.timeMark = TM.NotSet) Then
            parseInfo.timeMark = tm1
            goto Label_09C5
      End If
      If (parseInfo.timeMark = tm1) Then
            goto Label_09C5
      End If
      result.SetFailure(ParseFailureKind.FormatWithParameter, 
"Format_RepeatDateTimePattern", ch1)
      Return False
Label_08FC:
      If (ch1 = " "c) Then
            If (Not parseInfo.fAllowInnerWhite AndAlso Not str.Match(ch1)) 
Then
                  If ((parseInfo.fAllowTrailingWhite AndAlso format.GetNext) 
AndAlso DateTimeParse.ParseByFormat(str, format, parseInfo, dtfi, result)) 
Then
                        Return True
                  End If
                  result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                  Return False
            End If
      ElseIf format.MatchSpecifiedWord("GMT") Then
            format.Index = (format.Index + ("GMT".Length - 1))
            result.flags = (result.flags Or ParseFlags.TimeZoneUsed)
            result.timeZoneOffset = TimeSpan.Zero
            If Not str.Match("GMT") Then
                  result.SetFailure(ParseFailureKind.Format, 
"Format_BadDateTime", Nothing)
                  Return False
            End If
      ElseIf Not str.Match(ch1) Then
            result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", 
Nothing)
            Return False
      End If
Label_09C5:
      Return True
End Function
-- 

 stringa e' un po' complesso....
Di norma per non impazzire o si usa una formattazione FISSA, oppure quella
del sistema operativo.
Con la DateSerial puoi gestirti bene se hai una formattazione fissa, con il
CDate dovresti avere successo se la data è localizzata col sistema
operativo.
Eventualmente puoi permettere all'utente di scrivere la data come vuole (es
25122006), poi al validate gli dai il formato che vuoi tu (25/12/2005), e
se non la riconosci mandi un messaggio o roba simile, in maniera che
l'utente la scriva con un minimo di decenza.
Altrimenti credo diventi una cosa impossibile da gestire con sicurezza.


 [...]
Gulp!  o__O
mi sa che mi conviene cercare un'altra via.... grazie comunque!!!
Ciao
Rusko

 [...]
mi sa che faro' cosi'.... grazie lo stesso!!!
Ciao
Rusko