无法使用 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))
请注意,在 运行 时间可以有许多其他替代方法来替换时区。此解决方案不包括任何错误处理,例如输入字符串未出现任何时区!!
如果您希望能够在字符串中支持 PST
和 PDT
,我会创建某种从缩写到偏移量的映射。 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);
在我的 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))
请注意,在 运行 时间可以有许多其他替代方法来替换时区。此解决方案不包括任何错误处理,例如输入字符串未出现任何时区!!
如果您希望能够在字符串中支持 PST
和 PDT
,我会创建某种从缩写到偏移量的映射。 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);