question re: date format in RSS news feeds

Discussion in 'ASP .Net' started by Milsnips, Jan 13, 2006.

  1. Milsnips

    Milsnips Guest

    hi there,

    i am trying to get some feeds into my site, but am having problems with the
    converting the date format of "pubDate" into a datetime variable:

    <pubDate>Wed, 28 Sep 2005 08:00:00 UT</pubDate>

    It doesnt seem to like it? Any help appreciated

    thanks,
    Paul
     
    Milsnips, Jan 13, 2006
    #1
    1. Advertising

  2. Paul,

    I wish I could remember where this code is actually from. I've searched and
    can't find/remember the website. But it's from a gentleman who wrote an rss
    feed aggregator. His biggest complaint was the lack of a standardized date
    between types of feeds. Part of his code was this date class which he uses
    to standardize the dates (He gives it away free and says it's ok to modify
    so I'm posting it here. I'm going to keep searching for the site he put it
    out on):


    Imports Microsoft.VisualBasic

    Namespace RssComponents

    Public Class DateTimeExt

    Private Shared regExpression As String =
    "\s*(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)" & _
    "\s*,\s*)?(\d{1,2})\s+(Jan|Feb|Mar|Apr|May|Jun" & _
    "|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d{2,})\s+(\d{2})\s*:\s*(\d{2})\s*(?::\s*(\d{2}))?"
    & _
    "\s+([+\-]\d{4}|UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])"
    Private Shared rfc2822 As Regex = New Regex(regExpression,
    RegexOptions.Compiled)
    Private Shared months As New ArrayList(New String() _
    {"ZeroIndex", "Jan", "Feb", "Mar", "Apr", "May", "Jun", _
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"})

    'private static TimeSpan dayLightDelta =
    TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Now.Year).Delta

    ''' <summary>
    ''' Converts an ISO 8601 date to a DateTime object. Helper method
    needed to
    ''' deal with timezone offset since they are unsupported by the
    ''' .NET Framework.
    ''' </summary>
    ''' <param name="datetime">DateTime string</param>
    ''' <returns>DateTime instance</returns>
    ''' <exception cref="FormatException">On format errors parsing the
    datetime</exception>
    Public Shared Function ToDateTime(ByVal datetime As String) As
    DateTime

    Dim timeIndex As Integer = datetime.IndexOf(":")

    If timeIndex <> -1 Then

    Dim tzoneIndex As Integer = datetime.IndexOf("-", timeIndex)

    If tzoneIndex = -1 Then
    tzoneIndex = datetime.IndexOf("+", timeIndex)
    If tzoneIndex <> -1 Then 'timezone is ahead of UTC
    Return AddOffset("+", datetime, tzoneIndex)

    End If

    Else 'timezone is behind UTC

    Return AddOffset("-", datetime, tzoneIndex)
    End If


    End If

    Return System.Xml.XmlConvert.ToDateTime(datetime,
    "yyyy-MM-ddTHH:mm:sszzzzzz")

    End Function

    ''' <summary>
    ''' Parse is able to parse RFC2822/RFC822 formatted dates.
    ''' It has a fallback mechanism: if the string does not match,
    ''' the normal DateTime.Parse() function is called.
    ''' </summary>
    ''' <param name="dateTimeString">DateTime String to parse</param>
    ''' <returns>DateTime instance</returns>
    ''' <exception cref="FormatException">On format errors parsing the
    datetime</exception>
    Public Shared Function Parse(ByVal dateTimeString As String) As
    DateTime

    If dateTimeString = Nothing Then
    Return DateTime.Now.ToUniversalTime()
    End If

    If dateTimeString.Trim().Length = 0 Then
    Return DateTime.Now.ToUniversalTime()
    End If

    Dim m As Match = rfc2822.Match(dateTimeString)
    If m.Success Then

    Try
    Dim dd As Integer = Int32.Parse(m.Groups(1).Value)
    Dim mth As Integer = months.IndexOf(m.Groups(2).Value)
    Dim yy As Integer = Int32.Parse(m.Groups(3).Value)
    ' following year completion is compliant with RFC 2822.
    'yy = (yy < 50 ? 2000 + yy: (yy < 1000 ? 1900 + yy: yy))
    Dim hh As Integer = Int32.Parse(m.Groups(4).Value)
    Dim mm As Integer = Int32.Parse(m.Groups(5).Value)
    Dim ss As Integer = Int32.Parse(m.Groups(6).Value)
    Dim zone As String = m.Groups(7).Value

    Dim xd As New DateTime(yy, mth, dd, hh, mm, ss)

    Return xd.AddHours(RFCTimeZoneToGMTBias(zone) * -1)
    Catch ex As Exception

    Throw New
    FormatException("RES_ExceptionRFC2822ParseGroupsMessage")
    End Try
    Else
    ' fallback, if regex does not match:
    Return DateTime.Parse(dateTimeString)

    End If
    End Function

    Private Sub New()
    'constructor is new to prevent creation, we just need the
    statics
    End Sub


    Private Structure TZB
    Public Sub New(ByVal z As String, ByVal b As Integer)
    Zone = z
    Bias = b
    End Sub

    Public Zone As String
    Public Bias As Integer
    End Structure

    Private Const timeZones As Integer = 34
    Private Shared ZoneBias As TZB() = New TZB(timeZones) { _
    New TZB("GMT", 0), New TZB("UT", 0), _
    New TZB("EST", -5 * 60), New TZB("EDT", -4 * 60), _
    New TZB("CST", -6 * 60), New TZB("CDT", -5 * 60), _
    New TZB("MST", -7 * 60), New TZB("MDT", -6 * 60), _
    New TZB("PST", -8 * 60), New TZB("PDT", -7 * 60), _
    New TZB("Z", 0), New TZB("A", -1 * 60), _
    New TZB("B", -2 * 60), New TZB("C", -3 * 60), _
    New TZB("D", -4 * 60), New TZB("E", -5 * 60), _
    New TZB("F", -6 * 60), New TZB("G", -7 * 60), _
    New TZB("H", -8 * 60), New TZB("I", -9 * 60), _
    New TZB("K", -10 * 60), New TZB("L", -11 * 60), _
    New TZB("M", -12 * 60), New TZB("N", 1 * 60), _
    New TZB("O", 2 * 60), New TZB("P", 3 * 60), _
    New TZB("Q", 4 * 60), New TZB("R", 3 * 60), _
    New TZB("S", 6 * 60), New TZB("T", 3 * 60), _
    New TZB("U", 8 * 60), New TZB("V", 3 * 60), _
    New TZB("W", 10 * 60), New TZB("X", 3 * 60), _
    New TZB("Y", 12 * 60)}

    Private Shared Function RFCTimeZoneToGMTBias(ByVal zone As String)
    As Double

    Dim s As String

    If zone.IndexOfAny(New Char() {"+"c, "-"c}) = 0 Then ' +hhmm
    format

    Dim fact As Integer
    If zone.Substring(0, 1) = "-" Then
    fact = -1
    Else
    fact = 1
    End If

    s = zone.Substring(1).TrimEnd()
    Dim hh As Double = Math.Min(23, Int32.Parse(s.Substring(0,
    2)))
    Dim mm As Double = Math.Min(59, Int32.Parse(s.Substring(2,
    2))) / 60
    Return fact * (hh + mm)
    Else
    ' named format
    s = zone.ToUpper().Trim()
    For i As Integer = 0 To timeZones
    If (ZoneBias(i).Zone.Equals(s)) Then
    Return ZoneBias(i).Bias / 60
    End If
    Next

    End If

    Return 0.0
    End Function

    Private Shared Function AddOffset(ByVal offsetOp As String, ByVal
    datetimeString As String, ByVal tzoneIndex As Integer) As DateTime

    Dim offset As String() = datetimeString.Substring(tzoneIndex +
    1).Split(New Char() {":"c})
    Dim original As String = datetimeString
    datetimeString = datetimeString.Substring(0, tzoneIndex)

    If (datetimeString.IndexOf(":") =
    datetimeString.LastIndexOf(":")) Then 'check if seconds part is missing
    datetimeString = datetimeString + ":00"
    End If

    Dim toReturn As DateTime =
    System.Xml.XmlConvert.ToDateTime(datetimeString,
    "yyyy-MM-ddTHH:mm:sszzzzzz")

    Try
    Select Case offsetOp
    Case "+"
    toReturn = toReturn.Subtract(New
    TimeSpan(Int32.Parse(offset(0)), Int32.Parse(offset(1)), 0))
    Case "-"
    toReturn = toReturn.Add(New
    TimeSpan(Int32.Parse(offset(0)), Int32.Parse(offset(1)), 0))
    End Select

    Return toReturn '.ToLocalTime() 'we treat all dates in feeds
    as if they are local time (later)

    Catch iex As IndexOutOfRangeException

    Throw New
    FormatException("RES_ExceptionRFC2822InvalidTimezoneFormatMessage")
    End Try

    End Function

    End Class
    End Namespace


    --
    Sincerely,

    S. Justin Gengo, MCP
    Web Developer / Programmer

    www.aboutfortunate.com

    "Out of chaos comes order."
    Nietzsche
    "Milsnips" <> wrote in message
    news:...
    > hi there,
    >
    > i am trying to get some feeds into my site, but am having problems with
    > the converting the date format of "pubDate" into a datetime variable:
    >
    > <pubDate>Wed, 28 Sep 2005 08:00:00 UT</pubDate>
    >
    > It doesnt seem to like it? Any help appreciated
    >
    > thanks,
    > Paul
    >
     
    S. Justin Gengo [MCP], Jan 13, 2006
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ken

    Rss News Feeds ???

    Ken, Oct 18, 2003, in forum: ASP .Net
    Replies:
    2
    Views:
    388
  2. Patrick Olurotimi Ige
    Replies:
    2
    Views:
    494
    Patrick Olurotimi Ige
    May 5, 2005
  3. phil altimas

    XML RSS news feeds into web pages ?

    phil altimas, Oct 25, 2004, in forum: HTML
    Replies:
    4
    Views:
    461
    Mark Damon
    Oct 29, 2004
  4. Motta
    Replies:
    1
    Views:
    538
    Andy Dingley
    Jun 9, 2004
  5. Ken

    Rss News Feeds???

    Ken, Oct 18, 2003, in forum: ASP General
    Replies:
    2
    Views:
    140
Loading...

Share This Page