How to format RSS pubDate to DateTime?

Format RSS pubDate as .NET DateTime

  • How would I format the standard RSS pubDate string as something closer to ASP.NET's DateTime? So, from this: Wed, 29 Oct 2008 14:14:48 +0000 to this: 10/29/2008 2:14 PM

  • Answer:

    Something close to this should work: string orig = "Wed, 29 Oct 2008 14:14:48 +0000"; string newstring = String.Format("{0:MM/dd/yyyy hh:mm tt}", DateTime.Parse(orig.Remove(orig.IndexOf(" +")))); Taken from http://blog.stevex.net/index.php/string-formatting-in-csharp/

mmcglynn at Stack Overflow Visit the source

Was this solution helpful to you?

Other answers

I have an implementation of the RSS 822 DateTime format as a an answer to the question "http://stackoverflow.com/questions/284775/how-do-i-parse-and-convert-datetimes-to-the-rfc-822-date-time-format that should solve your problem. This is an implementation in C# of how to parse and convert a DateTime to and from its RFC-822 representation. The only restriction it has is that the DateTime is in Coordinated Universal Time (UTC). /// <summary> /// Provides methods for converting <see cref="DateTime"/> structures /// to and from the equivalent <a href="http://www.w3.org/Protocols/rfc822/#z28">RFC 822</a> /// string representation. /// </summary> public class Rfc822DateTime { //============================================================ // Private members //============================================================ #region Private Members /// <summary> /// Private member to hold array of formats that RFC 822 date-time representations conform to. /// </summary> private static string[] formats = new string[0]; /// <summary> /// Private member to hold the DateTime format string for representing a DateTime in the RFC 822 format. /// </summary> private const string format = "ddd, dd MMM yyyy HH:mm:ss K"; #endregion //============================================================ // Public Properties //============================================================ #region Rfc822DateTimeFormat /// <summary> /// Gets the custom format specifier that may be used to represent a <see cref="DateTime"/> in the RFC 822 format. /// </summary> /// <value>A <i>DateTime format string</i> that may be used to represent a <see cref="DateTime"/> in the RFC 822 format.</value> /// <remarks> /// <para> /// This method returns a string representation of a <see cref="DateTime"/> that utilizes the time zone /// offset (local differential) to represent the offset from Greenwich mean time in hours and minutes. /// The <see cref="Rfc822DateTimeFormat"/> is a valid date-time format string for use /// in the <see cref="DateTime.ToString(String, IFormatProvider)"/> method. /// </para> /// <para> /// The <a href="http://www.w3.org/Protocols/rfc822/#z28">RFC 822</a> Date and Time specification /// specifies that the year will be represented as a two-digit value, but the /// <a href="http://www.rssboard.org/rss-profile#data-types-datetime">RSS Profile</a> recommends that /// all date-time values should use a four-digit year. The <see cref="Rfc822DateTime"/> class /// follows the RSS Profile recommendation when converting a <see cref="DateTime"/> to the equivalent /// RFC 822 string representation. /// </para> /// </remarks> public static string Rfc822DateTimeFormat { get { return format; } } #endregion #region Rfc822DateTimePatterns /// <summary> /// Gets an array of the expected formats for RFC 822 date-time string representations. /// </summary> /// <value> /// An array of the expected formats for RFC 822 date-time string representations /// that may used in the <see cref="DateTime.TryParseExact(String, string[], IFormatProvider, DateTimeStyles, out DateTime)"/> method. /// </value> /// <remarks> /// The array of the expected formats that is returned assumes that the RFC 822 time zone /// is represented as or converted to a local differential representation. /// </remarks> /// <seealso cref="ConvertZoneToLocalDifferential(String)"/> public static string[] Rfc822DateTimePatterns { get { if (formats.Length > 0) { return formats; } else { formats = new string[35]; // two-digit day, four-digit year patterns formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz"; formats[1] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffffff zzzz"; formats[2] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffff zzzz"; formats[3] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffff zzzz"; formats[4] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fff zzzz"; formats[5] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ff zzzz"; formats[6] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'f zzzz"; formats[7] = "ddd',' dd MMM yyyy HH':'mm':'ss zzzz"; // two-digit day, two-digit year patterns formats[8] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffffff zzzz"; formats[9] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffffff zzzz"; formats[10] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffff zzzz"; formats[11] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffff zzzz"; formats[12] = "ddd',' dd MMM yy HH':'mm':'ss'.'fff zzzz"; formats[13] = "ddd',' dd MMM yy HH':'mm':'ss'.'ff zzzz"; formats[14] = "ddd',' dd MMM yy HH':'mm':'ss'.'f zzzz"; formats[15] = "ddd',' dd MMM yy HH':'mm':'ss zzzz"; // one-digit day, four-digit year patterns formats[16] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffffff zzzz"; formats[17] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffffff zzzz"; formats[18] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffff zzzz"; formats[19] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffff zzzz"; formats[20] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fff zzzz"; formats[21] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ff zzzz"; formats[22] = "ddd',' d MMM yyyy HH':'mm':'ss'.'f zzzz"; formats[23] = "ddd',' d MMM yyyy HH':'mm':'ss zzzz"; // two-digit day, two-digit year patterns formats[24] = "ddd',' d MMM yy HH':'mm':'ss'.'fffffff zzzz"; formats[25] = "ddd',' d MMM yy HH':'mm':'ss'.'ffffff zzzz"; formats[26] = "ddd',' d MMM yy HH':'mm':'ss'.'fffff zzzz"; formats[27] = "ddd',' d MMM yy HH':'mm':'ss'.'ffff zzzz"; formats[28] = "ddd',' d MMM yy HH':'mm':'ss'.'fff zzzz"; formats[29] = "ddd',' d MMM yy HH':'mm':'ss'.'ff zzzz"; formats[30] = "ddd',' d MMM yy HH':'mm':'ss'.'f zzzz"; formats[31] = "ddd',' d MMM yy HH':'mm':'ss zzzz"; // Fall back patterns formats[32] = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK"; // RoundtripDateTimePattern formats[33] = DateTimeFormatInfo.InvariantInfo.UniversalSortableDateTimePattern; formats[34] = DateTimeFormatInfo.InvariantInfo.SortableDateTimePattern; return formats; } } } #endregion //============================================================ // Public Methods //============================================================ #region Parse(string s) /// <summary> /// Converts the specified string representation of a date and time to its <see cref="DateTime"/> equivalent. /// </summary> /// <param name="s">A string containing a date and time to convert.</param> /// <returns> /// A <see cref="DateTime"/> equivalent to the date and time contained in <paramref name="s"/>, /// expressed as <i>Coordinated Universal Time (UTC)</i>. /// </returns> /// <remarks> /// The string <paramref name="s"/> is parsed using formatting information in the <see cref="DateTimeFormatInfo.InvariantInfo"/> object. /// </remarks> /// <exception cref="ArgumentNullException"><paramref name="s"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException"><paramref name="s"/> is an empty string.</exception> /// <exception cref="FormatException"><paramref name="s"/> does not contain a valid RFC 822 string representation of a date and time.</exception> public static DateTime Parse(string s) { //------------------------------------------------------------ // Validate parameter //------------------------------------------------------------ Guard.ArgumentNotNullOrEmptyString(s, "s"); DateTime result; if (Rfc822DateTime.TryParse(s, out result)) { return result; } else { throw new FormatException(String.Format(null, "{0} is not a valid RFC 822 string representation of a date and time.", s)); } } #endregion #region ConvertZoneToLocalDifferential(string s) /// <summary> /// Converts the time zone component of an RFC 822 date and time string representation to its local differential (time zone offset). /// </summary> /// <param name="s">A string containing an RFC 822 date and time to convert.</param> /// <returns>A date and time string that uses local differential to describe the time zone equivalent to the date and time contained in <paramref name="s"/>.</returns> /// <exception cref="ArgumentNullException"><paramref name="s"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException"><paramref name="s"/> is an empty string.</exception> public static string ConvertZoneToLocalDifferential(string s) { string zoneRepresentedAsLocalDifferential = String.Empty; //------------------------------------------------------------ // Validate parameter //------------------------------------------------------------ Guard.ArgumentNotNullOrEmptyString(s, "s"); if(s.EndsWith(" UT", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" UT") + 1) ), "+00:00"); } else if (s.EndsWith(" GMT", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" GMT") + 1 ) ), "+00:00"); } else if (s.EndsWith(" EST", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EST") + 1)), "-05:00"); } else if (s.EndsWith(" EDT", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EDT") + 1)), "-04:00"); } else if (s.EndsWith(" CST", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CST") + 1)), "-06:00"); } else if (s.EndsWith(" CDT", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CDT") + 1)), "-05:00"); } else if (s.EndsWith(" MST", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MST") + 1)), "-07:00"); } else if (s.EndsWith(" MDT", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MDT") + 1)), "-06:00"); } else if (s.EndsWith(" PST", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PST") + 1)), "-08:00"); } else if (s.EndsWith(" PDT", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PDT") + 1)), "-07:00"); } else if (s.EndsWith(" Z", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Z") + 1)), "+00:00"); } else if (s.EndsWith(" A", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" A") + 1)), "-01:00"); } else if (s.EndsWith(" M", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" M") + 1)), "-12:00"); } else if (s.EndsWith(" N", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" N") + 1)), "+01:00"); } else if (s.EndsWith(" Y", StringComparison.OrdinalIgnoreCase)) { zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Y") + 1)), "+12:00"); } else { zoneRepresentedAsLocalDifferential = s; } return zoneRepresentedAsLocalDifferential; } #endregion #region ToString(DateTime utcDateTime) /// <summary> /// Converts the value of the specified <see cref="DateTime"/> object to its equivalent string representation. /// </summary> /// <param name="utcDateTime">The Coordinated Universal Time (UTC) <see cref="DateTime"/> to convert.</param> /// <returns>A RFC 822 string representation of the value of the <paramref name="utcDateTime"/>.</returns> /// <exception cref="ArgumentException">The specified <paramref name="utcDateTime"/> object does not represent a <see cref="DateTimeKind.Utc">Coordinated Universal Time (UTC)</see> value.</exception> public static string ToString(DateTime utcDateTime) { if (utcDateTime.Kind != DateTimeKind.Utc) { throw new ArgumentException("utcDateTime"); } return utcDateTime.ToString(Rfc822DateTime.Rfc822DateTimeFormat, DateTimeFormatInfo.InvariantInfo); } #endregion #region TryParse(string s, out DateTime result) /// <summary> /// Converts the specified string representation of a date and time to its <see cref="DateTime"/> equivalent. /// </summary> /// <param name="s">A string containing a date and time to convert.</param> /// <param name="result"> /// When this method returns, contains the <see cref="DateTime"/> value equivalent to the date and time /// contained in <paramref name="s"/>, expressed as <i>Coordinated Universal Time (UTC)</i>, /// if the conversion succeeded, or <see cref="DateTime.MinValue">MinValue</see> if the conversion failed. /// The conversion fails if the s parameter is a <b>null</b> reference (Nothing in Visual Basic), /// or does not contain a valid string representation of a date and time. /// This parameter is passed uninitialized. /// </param> /// <returns><b>true</b> if the <paramref name="s"/> parameter was converted successfully; otherwise, <b>false</b>.</returns> /// <remarks> /// The string <paramref name="s"/> is parsed using formatting information in the <see cref="DateTimeFormatInfo.InvariantInfo"/> object. /// </remarks> public static bool TryParse(string s, out DateTime result) { //------------------------------------------------------------ // Attempt to convert string representation //------------------------------------------------------------ bool wasConverted = false; result = DateTime.MinValue; if (!String.IsNullOrEmpty(s)) { DateTime parseResult; if (DateTime.TryParseExact(Rfc822DateTime.ConvertZoneToLocalDifferential(s), Rfc822DateTime.Rfc822DateTimePatterns, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AdjustToUniversal, out parseResult)) { result = DateTime.SpecifyKind(parseResult, DateTimeKind.Utc); wasConverted = true; } } return wasConverted; } #endregion }

Oppositional

it is better to use DateTime.Now.Tostring("r") instead

Edwin Tai

Getting it into a DateTime will work with this, I think: string d = "Wed, 29 Oct 2008 14:14:48 +0000"; string RFC822 = "ddd, dd MMM yyyy HH:mm:ss zzz"; DateTime dt = DateTime.ParseExact( d, RFC822, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None); You might have to tinker with the Time zone info (zzz) at the end of the RFC822 format string.

Moose

Amit Sharma

Find solution

For every problem there is a solution! Proved by Solucija.

  • Got an issue and looking for advice?

  • Ask Solucija to search every corner of the Web for help.

  • Get workable solutions and helpful tips in a moment.

Just ask Solucija about an issue you face and immediately get a list of ready solutions, answers and tips from other Internet users. We always provide the most suitable and complete answer to your question at the top, along with a few good alternatives below.