如何将Paypal的HH:MM:SS DD Mmm(。)YYYY PST / PDT转换为C#UTC DateTime?

我想在SQL Server数据库中以这种格式记录payment_date。

更新。 本能是正确的。 在这里找到了一个解决方案: http : //www.codeillustrator.com/2010/03/converting-paypal-paymentdate-to-net.html ,validation……当然,如果Paypal移出西海岸,我’会遇到麻烦。 有没有更好的解析方法? 也许与TimeZone?

public static DateTime ConvertPayPalDateTime(string payPalDateTime) { // accept a few different date formats because of PST/PDT timezone and slight month difference in sandbox vs. prod. string[] dateFormats = { "HH:mm:ss MMM dd, yyyy PST", "HH:mm:ss MMM. dd, yyyy PST", "HH:mm:ss MMM dd, yyyy PDT", "HH:mm:ss MMM. dd, yyyy PDT" }; DateTime outputDateTime; DateTime.TryParseExact(payPalDateTime, dateFormats, new CultureInfo("en-US"), DateTimeStyles.None, out outputDateTime); // convert to local timezone outputDateTime = outputDateTime.AddHours(3); return outputDateTime; } 

等一下,上面的代码对我来说是完全错误的。 我在西海岸! 理想情况下,应更新此日期以将日期发送到正确的UTC DateTime并处理任何时区。 此外,上面的代码不能正确处理PDT(如果转换为UTC)。

UPDATE2。 显然,至少在以前的版本中,沙箱将返回“2月”。 而现场回归“二月”。 大声笑。 有人救了我!

UPDATE3。 链接到正则表达式版本http://www.ifinity.com.au/Blog/EntryId/77/Converting-PayPal-Dates-to-Net-DateTime-using-Regex ,但调试可能是一个问题。 正则表达式似乎不是正确的方法。 肯定有更好的办法。

 ///  /// Converts a PayPal datestring into a valid .net datetime value ///  /// a string containing a PayPal date /// the number of hours from UTC/GMT the local /// time is (ie, the timezone where the computer is) /// Valid DateTime value if successful, DateTime.MinDate if not private static DateTime ConvertFromPayPalDate(string rawPayPalDate, int localUtcOffset) { /* regex pattern splits paypal date into * time : hh:mm:ss * date : Mmm dd yyyy * timezone : PST/PDT */ const string payPalDateRegex = @"(?\d{1,2}:\d{2}:\d{2})\s(?(?[A-Za-z\.]{3,5})\s(?
\d{1,2}),?\s(?\d{4}))\s(?[AZ]{0,3})"; //!important : above line broken over two lines for formatting - rejoin in code editor //example 05:49:56 Oct. 18, 2009 PDT // 20:48:22 Dec 25, 2009 PST Match dateMatch = Regex.Match(rawPayPalDate, payPalDateRegex, RegexOptions.IgnoreCase); DateTime time, date = DateTime.MinValue; //check to see if the regex pattern matched the supplied string if (dateMatch.Success) { //extract the relevant parts of the date from regex match groups string rawDate = dateMatch.Groups["date"].Value; string rawTime = dateMatch.Groups["time"].Value; string tz = dateMatch.Groups["tz"].Value; //create date and time values if (DateTime.TryParse(rawTime, out time) && DateTime.TryParse(rawDate, out date)) { //add the time to the date value to get the datetime value date = date.Add(new TimeSpan(time.Hour, time.Minute, time.Second)); //adjust for the pdt timezone. Pass 0 to localUtcOffset to get UTC/GMT int offset = localUtcOffset + 7; //pdt = utc-7, pst = utc-8 if (tz == "PDT")//pacific daylight time date = date.AddHours(offset); else //pacific standard time date = date.AddHours(offset + 1); } } return date; }

我从2006年开始没有做任何C#,所以这段代码可能无法编译。 在飞行前测试它!

 public static DateTime ConvertPayPalDateTime(string payPalDateTime) { // Get the offset. // If C# supports switching on strings, it's probably more sensible to do that. int offset; if (payPalDateTime.EndsWith(" PDT")) { offset = 7; } else if (payPalDateTime.EndsWith(" PST")) { offset = 8; } else { throw some exception; } // We've "parsed" the time zone, so remove it from the string. payPalDatetime = payPalDateTime.Substring(0,payPalDateTime.Length-4); // Same formats as above, but with PST/PDT removed. string[] dateFormats = { "HH:mm:ss MMM dd, yyyy", "HH:mm:ss MMM. dd, yyyy" }; // Parse the date. Throw an exception if it fails. DateTime ret = DateTime.ParseExact(payPalDateTime, dateFormats, new CultureInfo("en-US"), DateTimeStyles.None, out outputDateTime); // Add the offset, and make it a universal time. return ret.AddHours(offset).SpecifyKind(DateTimeKind.Universal); } 

这应该工作

  public static DateTime ConvertPayPalDateTime(string payPalDateTime) { CultureInfo enUS = new CultureInfo("en-US"); // accept a few different date formats because of PST/PDT timezone and slight month difference in sandbox vs. prod. string[] dateFormats = { "HH:mm:ss MMM dd, yyyy PST", "HH:mm:ss MMM. dd, yyyy PST", "HH:mm:ss MMM dd, yyyy PDT", "HH:mm:ss MMM. dd, yyyy PDT", "HH:mm:ss dd MMM yyyy PST", "HH:mm:ss dd MMM. yyyy PST", "HH:mm:ss dd MMM yyyy PDT", "HH:mm:ss dd MMM. yyyy PDT"}; DateTime outputDateTime; DateTime.TryParseExact(payPalDateTime, dateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out outputDateTime); // convert to local timezone TimeZoneInfo hwZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); outputDateTime = TimeZoneInfo.ConvertTime(outputDateTime, hwZone, TimeZoneInfo.Local); return outputDateTime; } 

这篇文章中的代码似乎工作正常: http : //www.codeillustrator.com/2010/03/converting-paypal-paymentdate-to-net.html

 using System; using System.Globalization; public static class PayPalTransaction { public static DateTime ConvertPayPalDateTime(string payPalDateTime) { // accept a few different date formats because of PST/PDT timezone and slight month difference in sandbox vs. prod. string[] dateFormats = { "HH:mm:ss MMM dd, yyyy PST", "HH:mm:ss MMM. dd, yyyy PST", "HH:mm:ss MMM dd, yyyy PDT", "HH:mm:ss MMM. dd, yyyy PDT" }; DateTime outputDateTime; DateTime.TryParseExact(payPalDateTime, dateFormats, new CultureInfo("en-US"), DateTimeStyles.None, out outputDateTime); // convert to local timezone outputDateTime = outputDateTime.AddHours(3); return outputDateTime; } } 

(回答这个类似问题的交叉发布: 如何投射此日期并保存到数据库 )

假设您已经使用DateTime.ParseExact() (或其他类似方法之一)解析了日期,您可以调用DateTime.ToUniversalTime()

编辑:也许TimeZoneInfo.ConvertTimeToUtc更合适:ToUniversalTime方法将DateTime值从本地时间转换为UTC。 要将非本地时区的时间转换为UTC,请使用TimeZoneInfo.ConvertTimeToUtc(DateTime,TimeZoneInfo)方法。 要转换已知其UTC偏移的时间,请使用ToUniversalTime方法。