Italian Conversione date in formato RFC2822

Discussion in 'Italian Forum' started by AlpVir, Jun 5, 2015.

  1. AlpVir

    AlpVir Well-Known Member Licensed User

    La seguente funzione, scritta velocissimamente, converte un data espressa in formato in RFC2822 (esempio "Wed, 03 Jun 2015 13:50:05 GMT") in un Long più facilmente gestibile da B4A.

    Code:
    Sub TraduciData(D As StringAs String
       
    '--- utilizzo :   DtRemota=DateTime.DateParse(TraduciData(DataRemota)) 
       Dim S2      As String
       
    Dim S3      As String
       S2=Ucase(Mid(D,
    7,11)).Trim
       
    '--- mesi
       S2 = Replace(S2, "JAN","01")
       S2 = Replace(S2, 
    "FEB","02")
       S2 = Replace(S2, 
    "MAR","03")
       S2 = Replace(S2, 
    "APR","04")
       S2 = Replace(S2, 
    "MAY","05")
       S2 = Replace(S2, 
    "JUN","06")
       S2 = Replace(S2, 
    "JUL","07")
       S2 = Replace(S2, 
    "AUG","08")
       S2 = Replace(S2, 
    "SEP","09")
       S2 = Replace(S2, 
    "OCT","10")
       S2 = Replace(S2, 
    "NOV","11")
       S2 = Replace(S2, 
    "DEC","12")
       S3=Mid(D,
    19,8).Trim
       S = S2.Replace (
    " ","/") & " - " & S3.Replace(":","-")
       
    Return S
    End Sub
    Si può fare di meglio ? C'è qualche funzione specifica che ottenga il medesimo risultato ?
    Grazie per l'attenzione.
     
  2. LucaMs

    LucaMs Expert Licensed User

    Non penso che esista già una funzione del genere [la tua, cmq, restituisce un stringa, non un long, ma lo sai ;)]

    Andrebbe perfezionata, ora non ho tempo, sigh.

    Dovresti tenere conto del formato di data attuale sul dispositivo (DateTime.DateFormat).

    Per capirci meglio, cambierei intanto i nomi alle variabili S2 e S3.

    (Ucase e Mid suppongo che siano tue funzioni, non mi sembra che b4a le abbia, quindi, per renderla più generale, dovresti usare le SubString)


    P.S. Ucase non serve, c'è "miaStringa".ToUpperCase
     
  3. AlpVir

    AlpVir Well-Known Member Licensed User

    E' vero. La funzione l'ho scritta da cani, con Left, Mid, Right, Ucase e compagnia bella che sono funzioni mie.
    Ma la funzione funziona (sic) ma non vorrei che in particolarissimi casi si inchiodasse.
     
  4. LucaMs

    LucaMs Expert Licensed User

    Ovviamente non conosco l'RFC2822; intanto assicurati, se non l'hai già fatto, che il formato sia sempre ed esclusivamente quello e sempre con giorno/mese in inglese.

    Poi, qual'è il formato della stringa restituita? (con quei mid, ucase, replace, non posso farla funzionare e quindi testare; ci sono tutte le normali funzioni stringa di B4A, compresa la Replace).

    Imagino qualcosa tipo:
    03/06/2015 + orario

    la data, in quel formato, dd/MM/yyyy, potrebbe dare problemi nelle funzioni DateTime, come Parse, ad esempio, se l'app o il dispositivo hanno un formato data diverso, come MM/dd/yyyy, ad esempio.

    Dovresti usare tre variabili: Day, Month, Year (o in italiano), riempirle con il valore estratto dalla data RFC2822 e poi usare la funzione DateUtils.SetDate (libreria DateUtils) per ottenere il Long e, da questo, la stringa (DateTime.Date(LongOttenuto)).
     
  5. LucaMs

    LucaMs Expert Licensed User

    P.S. non è esattamente come ho scritto sopra, visto che non ho considerato l'orario, ma mi perdonerai, sto facendo 2349080 cose contemporaneamente :)
     
  6. AlpVir

    AlpVir Well-Known Member Licensed User

    In considerazione che la stringa in formato RCF2822 proviene da una fonte esterna e che sicuramente non cambia di formato non credo che valga la pena modificare la funzione che, come già detto, svolge egregiamente il suo sporco lavoro.
    Non esistendo probabilmente una funzione che in una sola riga risolva il tutto ho deciso che mi tengo le cose così come sono e pazienza se le ho scritte malamente.
    Sicuramente modificherò il nome delle variabili in modo che, a distanza di tempo, sia in grado di capire il significato di ciascuna di esse.
    Grazie.
     
  7. LucaMs

    LucaMs Expert Licensed User

    Hai provato ad impostare diversi formati di data e poi usare la funzione passandogli la stessa stringa RCF2822?

    Code:
    Dim D As String = "Wed, 03 Jun 2015 13:50:05 GMT"

    DateTime.DateFormat = "MM/dd/yyyy"
    Log(TraduciData(D))

    DateTime.DateFormat = "dd/MM/yyyy"
    Log(TraduciData(D))

    DateTime.DateFormat = "yyyy/MM/dd"
    Log(TraduciData(D))

    DateTime.DateFormat = "yyyy/dd/MM"
    Log(TraduciData(D))
     
    Last edited: Jun 6, 2015
  8. LucaMs

    LucaMs Expert Licensed User

    Code:
    ' ConvertRCF2822Date Test
        Dim D As String = "Wed, 03 Jun 2015 13:50:05 GMT"

        
    DateTime.DateFormat = "MM/dd/yyyy"
        
    Log(ConvertRCF2822Date(D))

        
    DateTime.DateFormat = "dd/MM/yyyy"
        
    Log(ConvertRCF2822Date(D))

        
    DateTime.DateFormat = "yyyy/MM/dd"
        
    Log(ConvertRCF2822Date(D))

        
    DateTime.DateFormat = "yyyy/dd/MM"
        
    Log(ConvertRCF2822Date(D))
    Code:
    Sub ConvertRCF2822Date(RCF2822Date As StringAs String
        
    Dim Result As String

        
    Dim Day, Month, Year As Int
        
    Dim MonthString As String
        
    Dim lngDate As Long

        Day = RCF2822Date.SubString2(
    5,7)
        MonthString = RCF2822Date.SubString2(
    8,11)
        Month = 
    "JanFebMarAprMayJunJulAugSepOctNovDec".IndexOf(MonthString) / 3 + 1
        Year = RCF2822Date.SubString2(
    12,16)

        lngDate = DateUtils.SetDate(Year, Month, Day)

        Result = 
    DateTime.Date(lngDate)

        
    Return Result
    End Sub

    Versione più compatta (di poco e meno leggibile):
    Code:
    Sub ConvertRCF2822Date(RCF2822Date As StringAs String
        
    Dim Day, Month, Year As Int
        
    Dim lngDate As Long

        Day = RCF2822Date.SubString2(
    5,7)
        Month = 
    "JanFebMarAprMayJunJulAugSepOctNovDec".IndexOf(RCF2822Date.SubString2(8,11)) / 3 + 1
        Year = RCF2822Date.SubString2(
    12,16)

        lngDate = DateUtils.SetDate(Year, Month, Day)
     
        
    Return DateTime.Date(lngDate)
    End Sub


    Versione ancora più compatta (e ancora meno leggibile :D ):
    Code:
    Sub ConvertRCF2822Date(RCF2822Date As StringAs String
        
    Dim Day, Month, Year As Int

        Day = RCF2822Date.SubString2(
    5,7)
        Month = 
    "JanFebMarAprMayJunJulAugSepOctNovDec".IndexOf(RCF2822Date.SubString2(8,11)) / 3 + 1
        Year = RCF2822Date.SubString2(
    12,16)

        
    Return DateTime.Date(DateUtils.SetDate(Year, Month, Day))
    End Sub
     
    Last edited: Jun 6, 2015
    ellpopeb4a likes this.
  9. AlpVir

    AlpVir Well-Known Member Licensed User

    OK
    Grazie
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice