无法使用 C# 将从 PayPal 收到的日期转换为 UTC 日期

Cannot convert Date received from PayPal to UTC date using C#

在我的 ASP.Net 应用程序中,我从 PayPal 收到一个日期字符串,当我尝试将其转换为 UTC 日期时,它总是失败。我已经在 LINQPad 工具中尝试过这种转换,但我总是无法成功解析日期字符串。

我的 ASP.Net 页面从 PayPal 收到的日期字符串是这样的:08:45:29 May 25, 2016 PDT

问题:如何在 C# 中成功地将 PayPal 接收日期转换为 UTC 日期?到目前为止我尝试过的代码如下。

LINQPad 中用于将 PayPal 日期转换为 UTC 日期的代码

string payPalDateString = "08:45:29 May 25, 2016 PDT";
DateTime date = DateTime.Now;

if( DateTime.TryParse(payPalDateString, out date) == true) {
      "payPalDateString was successfully parsed".Dump();
      DateTime dateUTC =  date.ToUniversalTime();
      dateUTC.Dump("payPalDateString in UTC is as below");
  } else {
      payPalDateString.Dump("payPalDateString was NOT successfully parsed");
 }

PayPal 文档说明了它发送的日期。

Time/Date stamp generated by PayPal, in the following format: HH:MM:SS DD Mmm YY, YYYY PST

PayPal文档中提到的上述日期格式实际上应该是:HH:mm:ss MMM dd, yyyy PST

请参考以下逻辑来准确解析 DateTime 来自 Paypal

的方式
DateTime newDate;
DateTime.TryParseExact("08:45:29 May 25, 2016 PDT", 
                       "HH:mm:ss MMM dd, yyyy PDT", 
                        CultureInfo.InvariantCulture, 
                        DateTimeStyles.None, out newDate);
var utcDateTime = newDate.ToUniversalTime();

我添加了dotnetfiddle代码


由于OP不确定传入的时区格式是PDT,建议他在转换格式中动态替换时区。他提出了这个逻辑。

String.Format("HH:mm:ss MMM dd, yyyy {0}", 
               payPalDateString.Substring(payPalDateString.Length - 3))

请注意,在 运行 时间可以有许多其他替代方法来替换时区。此解决方案不包括任何错误处理,例如输入字符串未出现任何时区!!

如果您希望能够在字符串中支持 PSTPDT,我会创建某种从缩写到偏移量的映射。 Time zone abbreviations 不是唯一的,因此您只需要包括与您的数据相关的那些(并希望 PayPal 不使用像 CST 这样的非唯一偏移量)。您可以从您所知道的开始,并根据需要添加更多内容:

Dictionary<string, string> TimeZones = new Dictionary<string, string> 
{
   {"PST", "-08:00"},
   {"PDT", "-07:00"},
   // more as needed 
};

string s = "08:45:29 May 25, 2016 PDT";

StringBuilder sb = new StringBuilder(s);

foreach(var kvp in TimeZones)
    sb = sb.Replace(kvp.Key,kvp.Value);

s = sb.ToString();

DateTime dt;
bool success = DateTime.TryParseExact(s, 
                                      "HH:mm:ss MMM dd, yyyy zzz",
                                      CultureInfo.InvariantCulture,
                                      DateTimeStyles.AdjustToUniversal,
                                      out dt);