elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 03:14  


Tema destacado: ¡Aprende hacking con práctica! - WarZone, el wargame de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  Conversión de fecha (PubDate)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Conversión de fecha (PubDate)  (Leído 877 veces)
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 693


Seguime


Ver Perfil WWW
Conversión de fecha (PubDate)
« en: 6 Junio 2011, 06:32 »

Hola alguien necesito pasar una tipo de fecha PubDate (son las que vienen los rss, feed, atom etc) pero bueno mirando un poco vi que tienen muchos formatos diferentes y no se bien si estoy haciendo lo correcto
por el momento hice esta función pero tengo problema con los dos últimos formatos
(2011-06-06T06:16:42+02:00    Y    2011-06-05T21:46:13Z) alguien conoce otra forma o como mejorar esta.

Código:
Option Explicit

Private Type TIME_ZONE_INFORMATION
   Bias As Long
   Reserved(0 To 169) As Byte
End Type
Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
       
Private Sub Form_Load()

Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 07:57:15 PDT")
Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 22:06:29 GMT")
Debug.Print PubDateToVBDate("2011-06-05 21:35:26")
Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 13:52:53 PST")
Debug.Print PubDateToVBDate("2011-06-06T06:16:42+02:00")
Debug.Print PubDateToVBDate("2011-06-05T21:46:13Z")


End Sub


Private Function PubDateToVBDate(ByVal sPubDate As String) As Date
    Dim TZI As TIME_ZONE_INFORMATION

    Dim sDate As String
    Dim lRet As Long
    lRet = InStr(sPubDate, ", ")
    If lRet Then
        sDate = Mid$(sPubDate, InStr(sPubDate, ", ") + 2)
    Else
        sDate = sPubDate
    End If

    If InStrRev(sDate, " ") <> InStr(sDate, " ") Then
        sDate = Left$(sDate, InStrRev(sDate, " "))
    End If
    GetTimeZoneInformation TZI
    sDate = DateAdd("h", -(TZI.Bias / 60), CDate(sDate))
    If InStr(sPubDate, "PDT") Then sDate = DateAdd("h", 7, sDate)
    If InStr(sPubDate, "PST") Then sDate = DateAdd("h", 8, sDate)
    PubDateToVBDate = sDate
End Function


En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Conversión de fecha (PubDate)
« Respuesta #1 en: 6 Junio 2011, 08:08 »

.

* Ni idea que signifique la Z pero aquí en México es una estación de radio.
* Lo que esta después de signo de + supongo que son las horas adiciones.
* No tome en consideración combinaciones de formatos ( Ej. Mie, 6 Jul 2005 13:00:00 -0700 ) .
* Esperando que se un formato tipo Timestamp funcionara este código.
* No me apegue mucho a el RFC 2822 ( ya lo habia consultado hace tiempo y aqui viene algo de esta etiqueta aun que no se si me estoy equivoco/confundo), de hecho solo realize el codigo en base a los formatos que has dejado...

Código
 
Option Explicit
 
Private Type TIME_ZONE_INFORMATION
  Bias                             As Long
  Reserved(0 To 169)               As Byte
End Type
Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
 
Private Sub Form_Load()
Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 07:57:15 PDT")
Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 22:06:29 GMT")
Debug.Print PubDateToVBDate("2011-06-05 21:35:26")
Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 13:52:53 PST")
Debug.Print PubDateToVBDate("2011-06-06T06:16:42+02:00")
Debug.Print PubDateToVBDate("2011-06-06T06:16:42-02:00")
Debug.Print PubDateToVBDate("2011-06-05T21:46:13Z")
End Sub
 
Private Function PubDateToVBDate(ByVal sPubDate As String) As Date
Dim stTZI           As TIME_ZONE_INFORMATION
Dim lln             As Long
Dim sTagGet         As String
Dim sAdd            As String
Dim lAdd            As Long
Dim llnAdd          As Long
 
   GetTimeZoneInformation stTZI
 
   If (UCase(Mid$(sPubDate, 11, 1)) = "T") Then
       Mid$(sPubDate, 11, 1) = " "
       lln = InStrRev(sPubDate, "+")
       If (lln > 0) Then
           lAdd = 1
       Else
           lln = InStrRev(sPubDate, "-")
           If (lln > 0) Then
               lAdd = (-1)
           End If
       End If
       If (lln > 0) Then
           sAdd = Mid$(sPubDate, lln + 1)
           llnAdd = Len(sAdd)
           If (lAdd = 1) Then
               sPubDate = Replace$(sPubDate, "+" & sAdd, "")
           Else
               sPubDate = Replace$(sPubDate, "-" & sAdd, "")
           End If
       End If
       sTagGet = sPubDate
       Mid$(sPubDate, 1, 2) = Mid$(sTagGet, 9, 2)  '   //  Dia.
       Mid$(sPubDate, 3, 1) = " "
       Mid$(sPubDate, 4, 2) = Mid$(sTagGet, 6, 2)  '   //  Mes.
       Mid$(sPubDate, 6, 1) = " "
       Mid$(sPubDate, 7, 4) = Mid$(sTagGet, 1, 4)  '   //  Año.
       lln = Len(sPubDate)
       If (lln > 19) Then
           sPubDate = Left$(sPubDate, 19)
       End If
       If (llnAdd > 0) Then
           If (llnAdd >= 2) Then
               sPubDate = DateAdd("h", Val(Mid$(sAdd, 1, 2)) * lAdd, CDate(sPubDate)) '   //  Horas
           End If
           If (llnAdd >= 5) Then
               sPubDate = DateAdd("m", Val(Mid$(sAdd, 4, 2)) * lAdd, CDate(sPubDate)) '   //  Minutos
           End If
           If (llnAdd >= 8) Then
               sPubDate = DateAdd("s", Val(Mid$(sAdd, 7, 2)) * lAdd, CDate(sPubDate)) '   //  Segundos
           End If
       End If
   Else
       lln = Len(sPubDate)
       sTagGet = Right$(sPubDate, 3)
       sPubDate = Mid$(sPubDate, InStr(sPubDate, ", ") + 2)
       sPubDate = Left$(sPubDate, InStrRev(sPubDate, " ") - 1)
       sPubDate = DateAdd("h", -(stTZI.Bias / 60), CDate(sPubDate))
       Select Case sTagGet
           Case "PDT"
               sPubDate = DateAdd("h", 7, sPubDate)
           Case "PST"
               sPubDate = DateAdd("h", 8, sPubDate)
           'Case "GMT"
               '   //  No se que hacer xP...
       End Select
   End If
   PubDateToVBDate = CDate(sPubDate)
End Function
 
 

Temibles Lunas!¡.


« Última modificación: 6 Junio 2011, 08:32 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 693


Seguime


Ver Perfil WWW
Re: Conversión de fecha (PubDate)
« Respuesta #2 en: 7 Junio 2011, 03:23 »

Hola gracias, por lo que creo la Z es lo mismo que tu nick Zero osea  0, segui buscando y encontre otros formatos mas asi que reize la funcion, la funcion que vos hisiste tiene un problema al obtener la fecha utilizando mid() ya que si esta en el formato norteamericano ponen el año primero.

Código:
Option Explicit
 
Private Type TIME_ZONE_INFORMATION
   Bias                             As Long
   Reserved(0 To 169)               As Byte
End Type
Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
 
Private Sub Form_Load()

    Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 07:57:15 PDT")
    Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 22:06:29 GMT")
    Debug.Print PubDateToVBDate("Mon, 06 Jun 2011 14:47:05 EDT")
    Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 13:52:53 PST")
    Debug.Print PubDateToVBDate("2011-06-05 21:35:26")
    Debug.Print PubDateToVBDate("8/7/2010 12:16:37 AM")
    Debug.Print PubDateToVBDate("8/6/2010 11:46:33 PM")
    Debug.Print PubDateToVBDate("6/6/2011 11:35:14 PM GMT")
    Debug.Print PubDateToVBDate("Wed, 27 Apr 2011 18:26:06 +0000")
    Debug.Print PubDateToVBDate("Wed, 27 Apr 2011 18:26:06 +0200")
    Debug.Print PubDateToVBDate("2011-06-06T06:16:42+02:00")
    Debug.Print PubDateToVBDate("2011-06-06T06:16:42-02:00")
    Debug.Print PubDateToVBDate("2011-06-06T05:40:00Z")
    Debug.Print PubDateToVBDate("2011-06-06T17:45:23+00:00")

End Sub
 
Private Function PubDateToVBDate(ByVal sPubDate As String) As Date
    Dim tTZI           As TIME_ZONE_INFORMATION
    Dim lRet As Long
    Dim TDelay As String
    Dim sSimbol As String
    Dim sHour As String
    Dim sMinute As String
    Dim ArrMonthEnglish As Variant
   
    Dim I As Long
 
    GetTimeZoneInformation tTZI
   
    sPubDate = UCase(sPubDate)
   
    ArrMonthEnglish = Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC")
   
    For I = 0 To 11
        sPubDate = Replace(sPubDate, CStr(ArrMonthEnglish(I)), I + 1)
    Next

    If IsDate(sPubDate) Then
        PubDateToVBDate = DateAdd("h", -(tTZI.Bias / 60), CDate(sPubDate))
        Exit Function
    End If
 
    lRet = InStr(sPubDate, ", ")
    If lRet Then
        sPubDate = Mid(sPubDate, lRet + 2)
    End If

    If IsDate(sPubDate) Then 'por las dudas
        PubDateToVBDate = DateAdd("h", -(tTZI.Bias / 60), CDate(sPubDate))
        Exit Function
    End If
   
    lRet = InStr(sPubDate, " ")

    If lRet = 0 Then
        sPubDate = Replace(sPubDate, "T", " ")
        If Right(sPubDate, 1) = "Z" Then
            sPubDate = Replace(sPubDate, "Z", "+00:00")
        End If
        TDelay = Replace(Right$(sPubDate, 6), ":", "")
        sPubDate = Left$(sPubDate, Len(sPubDate) - 6)
    Else
       
        Select Case Right(sPubDate, 3)
            Case "GMT":         TDelay = "+0000"
            Case "EDT":         TDelay = "-0400"
            Case "CDT", "EST":  TDelay = "-0500"
            Case "CST", "MDT":  TDelay = "-0600"
            Case "MST", "PDT":  TDelay = "-0700"
            Case "PST", "ADT":  TDelay = "-0800"
            Case "AST", "HDT":  TDelay = "-0900"
            Case "HDT":         TDelay = "-1000"
        End Select

        If Len(TDelay) Then
            sPubDate = Left(sPubDate, Len(sPubDate) - 4)
        Else
            TDelay = Right(sPubDate, 5)
            sPubDate = Left(sPubDate, Len(sPubDate) - 6)
         
        End If
    End If
   
    If IsDate(sPubDate) Then
   
        sSimbol = Left$(TDelay, 1)
        sHour = Mid$(TDelay, 2, 2)
        sMinute = Right$(TDelay, 2)
       
        If IsNumeric(sHour) And IsNumeric(sMinute) Then
            If sSimbol = "+" Then
                sPubDate = DateAdd("h", -Val(sHour), CDate(sPubDate))
                sPubDate = DateAdd("m", -Val(sMinute), CDate(sPubDate))
            ElseIf sSimbol = "-" Then
                sPubDate = DateAdd("h", Val(sHour), CDate(sPubDate))
                sPubDate = DateAdd("m", Val(sMinute), CDate(sPubDate))
            End If
           
            PubDateToVBDate = DateAdd("h", -(tTZI.Bias / 60), CDate(sPubDate))
        End If
       
    End If
           
End Function

creo que no hay mas variantes, si alguno encuentra algo que avise.

Saludos
En línea

raul338
Moderador
***
Conectado Conectado

Mensajes: 2.371


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Conversión de fecha (PubDate)
« Respuesta #3 en: 7 Junio 2011, 03:52 »

La Z proviene de Estandar ISO para fechas

Despues veo si puedo ayudar en la funcion :P
« Última modificación: 7 Junio 2011, 04:20 por raul338 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Fecha????
Chats; IRC y Messengers
Sweet_Angel_Girl 1 316 Último mensaje 30 Junio 2003, 12:42
por trent82
fecha en la web
Desarrollo Web
geel 2 402 Último mensaje 7 Septiembre 2007, 00:42
por дٳŦ٭
campos de fecha mysql y funciones de fecha php
PHP
SirLanceCC 9 3,393 Último mensaje 3 Enero 2008, 12:36
por Hans el Topo
Fecha en C#
.NET
fabricioAngel 0 1,088 Último mensaje 14 Abril 2010, 17:06
por fabricioAngel
Calcular dias entre Fecha A y Fecha B « 1 2 »
.NET
Braayhaan 19 2,981 Último mensaje 22 Julio 2010, 15:23
por MANULOMM
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines