Italian Conversione date in formato RFC2822

AlpVir

Well-Known Member
Licensed User
Longtime 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.

B4X:
Sub TraduciData(D As String) As 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.
 

LucaMs

Expert
Licensed User
Longtime 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
 

AlpVir

Well-Known Member
Licensed User
Longtime 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.
 

LucaMs

Expert
Licensed User
Longtime 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)).
 

AlpVir

Well-Known Member
Licensed User
Longtime 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.
 

LucaMs

Expert
Licensed User
Longtime User
la funzione che, come già detto, svolge egregiamente il suo sporco lavoro.

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

B4X:
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:

LucaMs

Expert
Licensed User
Longtime User
B4X:
' 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))

B4X:
Sub ConvertRCF2822Date(RCF2822Date As String) As 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):
B4X:
Sub ConvertRCF2822Date(RCF2822Date As String) As 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 ):
B4X:
Sub ConvertRCF2822Date(RCF2822Date As String) As 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:
Top