2011-06-27 48 views
9

我想以这种格式在SQL Server数据库中记录payment_date。如何将Paypal的HH:MM:SS DD Mmm(。)YYYY PST/PDT转换为C#UTC DateTime?

更新。 Instinct在这一个上是对的。在这里找到了一个解决方案:http://www.codeillustrator.com/2010/03/converting-paypal-paymentdate-to-net.html,验证......当然,如果贝宝永远离开西海岸,我会遇到麻烦。有没有更好的方法来解析这个?也许在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日期时间并处理任何时区。此外,上面的代码不能正确处理PDT(如果转换为UTC)。

Update2。显然,至少在以前的版本中,沙箱会返回“Feb.”而现场回报“2月”。大声笑。有人救了我!

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

/// <summary> 
/// Converts a PayPal datestring into a valid .net datetime value 
/// </summary> 
/// <param name="dateValue">a string containing a PayPal date</param> 
/// <param name="localUtcOffset">the number of hours from UTC/GMT the local 
/// time is (ie, the timezone where the computer is)</param> 
/// <returns>Valid DateTime value if successful, DateTime.MinDate if not</returns> 
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 = @"(?<time>\d{1,2}:\d{2}:\d{2})\s(?<date>(?< 
Mmm>[A-Za-z\.]{3,5})\s(?<dd>\d{1,2}),?\s(?<yyyy>\d{4}))\s(?<tz>[A-Z]{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; 
} 
+2

你想用哪种格式登录数据库?你到目前为止尝试过什么? –

+0

支付DATETIME,还没有尝试过任何东西 - 虽然这可能会伎俩http://www.codeillustrator.com/2010/03/converting-paypal-paymentdate-to-net.html – tofutim

+0

请注意,链接的代码不区分PST和PDT,因此每年都要休息一个小时! –

回答

6

自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); 
} 
0

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

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

+0

我不确定我可以信任我的ParseExact。 – tofutim

+0

-1。 “ToUniversalTime()'会将它解释为你当地时区的一个时间,这增加了更多的边缘情况来处理(我不认为Windows保留历史时区数据)。 –

2

在这篇文章中的代码似乎很好地工作: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; 
    } 
} 

(回答交叉张贴此类似的问题:How to cast this date and save to database

3

这应该工作

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; 
} 
相关问题