PayPal日期时间(payment_date)解析问题

9

PayPal发送的付款datetime格式如下:

09%3A37%3A22+Nov+18%2C+2012+PST

我尝试使用以下代码进行转换,但是出现了异常。

有什么方法可以解析它吗?

谢谢!

DateTime paymentDate;
DateTime.TryParse(WebUtility.HtmlDecode(r["payment_date"]), out paymentDate);
n.PaymentDate = paymentDate; // payment_date=09%3A37%3A22+Nov+18%2C+2012+PST
2个回答

14

PayPal的文档中有各种不同的日期时间格式。我使用这种方法来解析它,并将其转换为UTC:

/// <summary>
/// Tries to parse PayPal formatted date and time and converts it to an UTC.
/// </summary>
public static bool TryParsePaypalDatetimeToUtc(this string paypalDatetime, out DateTime retValue)
{
    DateTime paymentDate;

    // PayPal formats from docs
    string[] formats = new string[] { "HH:mm:ss dd MMM 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 MMM dd, yyyy PST", "HH:mm:ss MMM dd, yyyy PDT" };
    if (false == DateTime.TryParseExact(paypalDatetime, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out paymentDate))
    {
        retValue = DateTime.MinValue;
        return false;
    }

    retValue = TimeZoneInfo.ConvertTimeToUtc(paymentDate, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));

    return true;
}

2
如果您将paypalDatetime.Replace("PST", "-08:00").Replace("PDT", "-07:00")用作TryParseExact方法的输入参数,则可以将格式数量减少到3个(将PDT和PST替换为zzz)。然后,您可以简单地设置retValue = paymentDate.ToUniversalTime(); - Ben

11

这应该就可以解决问题:

DateTime paymentDate;
DateTime.TryParseExact(HttpUtility.UrlDecode(r["payment_date"]),
    "HH:mm:ss MMM dd, yyyy PST", CultureInfo.InvariantCulture,
    DateTimeStyles.None, out paymentDate);

1
+1,解决方案是使用HttpUtility.UrlDecode而不是WebUtility.HtmlDecode - Victor Zakharov
1
当然,如果存在可能 CurrentCultureTimeSeparatorAbbreviatedMonthNames 与英文不同(如 ":""Jan"/"Feb"/...),请使用 InvariantCulture 作为 provider 而非 null - Jeppe Stig Nielsen
1
现在它们似乎已经将其更改为“PDT”,而不是“PST”,例如“HH:mm:ss MMM dd, yyyy PDT”。 - Ostati
1
Paypal有时会发送PST日期,有时会发送PDT日期,因此这个解决方案已经过时且不可靠。@DHlavaty提供了正确的解决方案。 - Sandor
对于最佳解决方案,请查看Ben的评论。 - Sandor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接