Converts an RFC 822 DateTime String To A C# DateTime
Overview
This is a simple class that can be used to convert a RFC 822 compliant datetime string into a C# DateTime object. RFC 822 describes the date time format used by RSS as indicated in the RSS Specification Document. This class returns the RFC 822 date as a local datetime but also exposes the underlying Universal Time and other component parts.
Usage
PFSRfc822DateTimeConverter rfc822Conv = new PFSRfc822DateTimeConverter(); if (rfc822Conv.TryParse("Mon, 11 Mar 2019 01:57:00 EST" out DateTime rslt) { console.WriteLine(rslt.ToString("yyyy-MM-dd HH:mm:ss zzz"); } try { DateTime rt = rfc822Conv.Parse("Mon, 11 Mar 2019 01:57 A"); Console.WriteLine(rslt.ToString("yyyy-MM-dd HH:mm:ss zzz"); } catch(Exception) {}
What We Are Trying To Solve
RFC 822 compliant dates come in a wide variety of formats. For example, all of the following are valid:
Mon, 11 Mar 2019 01:57:00 EST 11 Mar 2019 01:57:23 EDT Mon, 11 Mar 2019 01:57:00 -0500 Mon, 11 Mar 2019 01:57 A 11 Mar 2019 01:57 N 11 Mar 2019 01 A Mon, 11 Mar 2019 02:00 Z Mon, 11 Mar 2019 02:00:34 Z 11 Mar 2019 02:00 PST
and so on and so on. Now if you try to convert these with the DateTime.Parse method, you will get exceptions. Furthermore, if you try and parse these with the DateTime.ParseExact method, you might get some, but the format collection used to control the formatting is incredibly large. For example, look at the day of week. That is optional. Times don't have to include minutes and seconds for military formats and allow exclusion of seconds in all formats. The part of RFC 822 that governs the date format is included below.
5. DATE AND TIME SPECIFICATION 5.1. SYNTAX date-time = [ day "," ] date time ; dd mm yy ; hh:mm:ss zzz day = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun" date = 1*2DIGIT month 2DIGIT ; day month year ; e.g. 20 Jun 82 month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" time = hour zone ; ANSI and Military hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT] ; 00:00:00 - 23:59:59 zone = "UT" / "GMT" ; Universal Time ; North American : UT / "EST" / "EDT" ; Eastern: - 5/ - 4 / "CST" / "CDT" ; Central: - 6/ - 5 / "MST" / "MDT" ; Mountain: - 7/ - 6 / "PST" / "PDT" ; Pacific: - 8/ - 7 / 1ALPHA ; Military: Z = UT; ; A:-1; (J not used) ; M:-12; N:+1; Y:+12 / ( ("+" / "-") 4DIGIT ) ; Local differential ; hours+min. (HHMM) 5.2. SEMANTICS If included, day-of-week must be the day implied by the date specification. Time zone may be indicated in several ways. "UT" is Univer- sal Time (formerly called "Greenwich Mean Time"); "GMT" is per- mitted as a reference to Universal Time. The military standard uses a single character for each zone. "Z" is Universal Time. "A" indicates one hour earlier, and "M" indicates 12 hours ear- lier; "N" is one hour later, and "Y" is 12 hours later. The letter "J" is not used. The other remaining two forms are taken from ANSI standard X3.51-1975. One allows explicit indication of the amount of offset from UT; the other uses common 3-character strings for indicating time zones in North America.
Yikes! In any case, the enclosed project is a simple console app that exercises the
workings of the class.
Have Fun. (and rename the namespaces)
Contact me at http://sirpenski.com if you find it necessary.