elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  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 2,611 veces)
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


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

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
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


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

.

* 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
  1.  
  2. Option Explicit
  3.  
  4. Private Type TIME_ZONE_INFORMATION
  5.   Bias                             As Long
  6.   Reserved(0 To 169)               As Byte
  7. End Type
  8. Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
  9.  
  10. Private Sub Form_Load()
  11. Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 07:57:15 PDT")
  12. Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 22:06:29 GMT")
  13. Debug.Print PubDateToVBDate("2011-06-05 21:35:26")
  14. Debug.Print PubDateToVBDate("Sun, 05 Jun 2011 13:52:53 PST")
  15. Debug.Print PubDateToVBDate("2011-06-06T06:16:42+02:00")
  16. Debug.Print PubDateToVBDate("2011-06-06T06:16:42-02:00")
  17. Debug.Print PubDateToVBDate("2011-06-05T21:46:13Z")
  18. End Sub
  19.  
  20. Private Function PubDateToVBDate(ByVal sPubDate As String) As Date
  21. Dim stTZI           As TIME_ZONE_INFORMATION
  22. Dim lln             As Long
  23. Dim sTagGet         As String
  24. Dim sAdd            As String
  25. Dim lAdd            As Long
  26. Dim llnAdd          As Long
  27.  
  28.    GetTimeZoneInformation stTZI
  29.  
  30.    If (UCase(Mid$(sPubDate, 11, 1)) = "T") Then
  31.        Mid$(sPubDate, 11, 1) = " "
  32.        lln = InStrRev(sPubDate, "+")
  33.        If (lln > 0) Then
  34.            lAdd = 1
  35.        Else
  36.            lln = InStrRev(sPubDate, "-")
  37.            If (lln > 0) Then
  38.                lAdd = (-1)
  39.            End If
  40.        End If
  41.        If (lln > 0) Then
  42.            sAdd = Mid$(sPubDate, lln + 1)
  43.            llnAdd = Len(sAdd)
  44.            If (lAdd = 1) Then
  45.                sPubDate = Replace$(sPubDate, "+" & sAdd, "")
  46.            Else
  47.                sPubDate = Replace$(sPubDate, "-" & sAdd, "")
  48.            End If
  49.        End If
  50.        sTagGet = sPubDate
  51.        Mid$(sPubDate, 1, 2) = Mid$(sTagGet, 9, 2)  '   //  Dia.
  52.        Mid$(sPubDate, 3, 1) = " "
  53.        Mid$(sPubDate, 4, 2) = Mid$(sTagGet, 6, 2)  '   //  Mes.
  54.        Mid$(sPubDate, 6, 1) = " "
  55.        Mid$(sPubDate, 7, 4) = Mid$(sTagGet, 1, 4)  '   //  Año.
  56.        lln = Len(sPubDate)
  57.        If (lln > 19) Then
  58.            sPubDate = Left$(sPubDate, 19)
  59.        End If
  60.        If (llnAdd > 0) Then
  61.            If (llnAdd >= 2) Then
  62.                sPubDate = DateAdd("h", Val(Mid$(sAdd, 1, 2)) * lAdd, CDate(sPubDate)) '   //  Horas
  63.            End If
  64.            If (llnAdd >= 5) Then
  65.                sPubDate = DateAdd("m", Val(Mid$(sAdd, 4, 2)) * lAdd, CDate(sPubDate)) '   //  Minutos
  66.            End If
  67.            If (llnAdd >= 8) Then
  68.                sPubDate = DateAdd("s", Val(Mid$(sAdd, 7, 2)) * lAdd, CDate(sPubDate)) '   //  Segundos
  69.            End If
  70.        End If
  71.    Else
  72.        lln = Len(sPubDate)
  73.        sTagGet = Right$(sPubDate, 3)
  74.        sPubDate = Mid$(sPubDate, InStr(sPubDate, ", ") + 2)
  75.        sPubDate = Left$(sPubDate, InStrRev(sPubDate, " ") - 1)
  76.        sPubDate = DateAdd("h", -(stTZI.Bias / 60), CDate(sPubDate))
  77.        Select Case sTagGet
  78.            Case "PDT"
  79.                sPubDate = DateAdd("h", 7, sPubDate)
  80.            Case "PST"
  81.                sPubDate = DateAdd("h", 8, sPubDate)
  82.            'Case "GMT"
  83.                '   //  No se que hacer xP...
  84.        End Select
  85.    End If
  86.    PubDateToVBDate = CDate(sPubDate)
  87. End Function
  88.  
  89.  

Temibles Lunas!¡.


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

The Dark Shadow is my passion.
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


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

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


Desconectado Desconectado

Mensajes: 2.633


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 am »

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 am por raul338 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
campos de fecha mysql y funciones de fecha php
PHP
SirLanceCC 9 9,363 Último mensaje 3 Enero 2008, 12:36 pm
por Hans el Topo
Fecha en C#
.NET (C#, VB.NET, ASP)
Fabricio 0 2,621 Último mensaje 14 Abril 2010, 17:06 pm
por Fabricio
Calcular dias entre Fecha A y Fecha B « 1 2 »
.NET (C#, VB.NET, ASP)
Braayhaan 19 13,752 Último mensaje 22 Julio 2010, 15:23 pm
por MANULOMM
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines