Newsgroup: it.comp.www.asp
Titolo: Conversione date Rfc822 e Iso8601 per RSS

Avete qualcosa in ASP Classico per la conversione di formati da/a formato
locale/Rcf822/ISO8601 per l'utilizzo con feed RSS (per generarli o tradurli
manipolando le date)
Grazie
-- 
:: Massimiliano Mattei :: Project Leader
:: EVA Group :: 
http://www.evagroup.net
:: Commercio elettronico :: Soluzioni extranet :: Corporate portal

Come si dice.. chi fa da se... ;)
Ve le posto magari servono a qualcuno oltre a me. Per ora sono solo da RSS >
LCID 1040 (gg/mm/aaaa 
hh.mm
)
!! E' necessario che il LCID sia impostato a 1040 !!
La funzione principale è dateRSS2System(strInput) che converte una data da
formato ISO 8601 o RFC 822 a LCID 1040 GMT (!)
Esempio dateRSS2System("1997-07-16T19:20:30+01:00") restituisce 16/07/1997
18.20.30
Buon divertimento
Function dateRSS2System(strInput)
 Dim dateTemp
 ' #### ISO 8601 ####
 ' 1997-07-16T19:20:30+01:00
 ' 1997-07-16T19:20:30Z
 ' #### RFC 822 ####
 ' Tue, 23 Sep 2003 13:21:00 -07:00
 ' Tue, 23 Sep 2003 13:21:00 GMT
 If strInput & "" <> "" Then
  If Mid(strInput, 11, 1) = "T" Then dateTemp = dateISO2System(strInput)
Else dateTemp = dateRFC2System(strInput)
  dateRSS2System = dateTemp
 Else
  dateRSS2System = Null
 End If
End Function
Function dateRFC2System(strInput)
 Dim strTemp, strSMonthName
 Dim dateTemp
 Dim intDivTemp, intMinDiff, intHrsDiff
 ' Tue, 23 Sep 2003 13:21:00 -07:00
 strTemp = Mid(strInput, 6, 2)
 strTemp = strTemp & "/" &
strDoubleNum((Instr("_Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec_",Mid(
strInput, 9, 3))+2)/4)
 strTemp = strTemp & "/" & Mid(strInput, 13, 4)
 strTemp = strTemp & " " & Mid(strInput, 18, 2) & "." & Mid(strInput, 21, 2)
& "." & Mid(strInput, 24, 2)
 dateTemp =  CDate(strTemp)
 If Len(strInput) > 29 Then
  If Mid(strInput, 27, 1) = "+" Then intDivTemp = -1 Else intDivTemp = 1
  intHrsDiff = intDivTemp * CInt(Mid(strInput, 28, 2))
  intMinDiff = intDivTemp * CInt(Mid(strInput, 31, 2))
  dateTemp = DateAdd("H",intHrsDiff,dateTemp)' #### Modifica ore e minuti
fino a GMT ####
  dateTemp = DateAdd("N",intMinDiff,dateTemp)' #### Modifica ore e minuti
fino a GMT ####
 End If
 dateRFC2System = dateTemp
End Function
Function dateISO2System(strInput)
 Dim strTemp
 Dim dateTemp
 Dim intDivTemp, intMinDiff, intHrsDiff
 strTemp = Mid(strInput, 9, 2) & "/" & Mid(strInput, 6, 2) & "/" &
Left(strInput,4)
 strTemp = strTemp & " " & Mid(strInput, 12, 2) & "." & Mid(strInput, 15, 2)
& "." & Mid(strInput, 18, 2)
 dateTemp =  CDate(strTemp)
 If Len(strInput) > 20 Then
  If Mid(strInput, 20, 1) = "+" Then intDivTemp = -1 Else intDivTemp = 1
  intHrsDiff = intDivTemp * CInt(Mid(strInput, 21, 2))
  intMinDiff = intDivTemp * CInt(Mid(strInput, 24, 2))
  dateTemp = DateAdd("H",intHrsDiff,dateTemp)' #### Modifica ore e minuti
fino a GMT ####
  dateTemp = DateAdd("N",intMinDiff,dateTemp)' #### Modifica ore e minuti
fino a GMT ####
 End If
 dateISO2System = dateTemp
End Function
Function strDoubleNum(intNum)
 If IsNumeric(intNum & "") Then
  If Cint(intNum) > 9 Then strDoubleNum = Cint(intNum) Else strDoubleNum =
Right("0" & intNum,2)
 Else
  strDoubleNum = intNum
 End If
End function


Ho aggiunto un minimale controllo di errore nella funzione principale, nel
caso qualche feed allargasse un pò gli standard secondo i propri gusti :)
Function dateRSS2System(strInput)
 Dim dateTemp
 On Error Resume Next
 ' #### ISO 8601 ####
 ' 1997-07-16T19:20:30+01:00
 ' 1997-07-16T19:20:30Z
 ' #### RFC 822 ####
 ' Tue, 23 Sep 2003 13:21:00 -07:00
 ' Tue, 23 Sep 2003 13:21:00 GMT
 If strInput & "" <> "" Then
  If Mid(strInput, 11, 1) = "T" Then dateTemp = dateISO2System(strInput)
Else dateTemp = dateRFC2System(strInput)
  dateRSS2System = dateTemp
 Else
  dateRSS2System = Null
 End If
 If Err.Number <> 0 Then dateRSS2System = Null
 On Error Goto 0
End Function


Ho modificato la funzione dateISO2System affinchè includa anche le date dove
sono stati omessi i secondi. Non so se è standard, ma ho trovato alcuni feed
con questa caratteristica.
Tra l'altro sto postando le evoluzioni step-by-step perchè se qualcuno ha
suggerimenti/critiche in base alle proprie conoscenze in merito, magari
viene fuori qualcosa di più carino :)
Function dateISO2System(strInput)
 Dim strTemp
 Dim dateTemp
 Dim intDivTemp, intMinDiff, intHrsDiff, intOffset
 ' #### ISO 8601 ####
 ' 1997-07-16T19:20:30+01:00
 ' 1997-07-16T19:20:30Z
 ' 1997-07-16T19:20+00:00 ?
 ' 1997-07-16T19:20Z ?
 ' #### Verifica se sono stati omessi i secondi ####
 If Len(strInput) = 17 Or Len(strInput) = 22 Then intOffset = 3 Else
intOffset = 0
 strTemp = Mid(strInput, 9, 2) & "/" & Mid(strInput, 6, 2) & "/" &
Left(strInput,4)
 strTemp = strTemp & " " & Mid(strInput, 12, 2) & "." & Mid(strInput, 15, 2)
& "." & Mid(strInput, 18, 2)
 dateTemp =  CDate(strTemp)
 If Len(strInput) > 20 Then
  If Mid(strInput, 20 - intOffset, 1) = "+" Then intDivTemp = -1 Else
intDivTemp = 1
  intHrsDiff = intDivTemp * CInt(Mid(strInput, 21 - intOffset, 2))
  intMinDiff = intDivTemp * CInt(Mid(strInput, 24 - intOffset, 2))
  dateTemp = DateAdd("H",intHrsDiff,dateTemp)' #### Modifica ore fino a GMT
####
  dateTemp = DateAdd("N",intMinDiff,dateTemp)' #### Modifica minuti fino a
GMT ####
 End If
 dateISO2System = dateTemp
