9
votes

Comment convertir PayPal's HH: MM: SS DD MMM (.) AAAA PST / PDT à une dateTime C # UTC?

Je voudrais enregistrer un paiement_date dans ce format dans une base de données SQL Server.

update. strong> instinct était juste sur celui-ci. Trouvé une solution ici: http://www.codeillustrator.com/2010/03 /converting-paypal-paymentdate-a-net.html , vérifiant ... bien sûr, si PayPal quitte jamais la côte ouest, je serai en difficulté. Y a-t-il une meilleure façon de l'analyser? Peut-être avec Timezone? P>

/// <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;
}


5 commentaires

Quel format voulez-vous vous connecter dans la DB? Et qu'avez-vous essayé jusqu'à présent?


DateTime payé, je n'ai rien essayé encore - bien que cela puisse faire le tour CODELILDRATORATORINK.COM/2010/03/...


Notez que le code lié ne fait pas la distinction entre PST et PDT et va donc casser pendant une heure chaque année!


@TC, comment faisons-nous ce droit? Puis-je utiliser la fonctionnalité TimeZone dans .NET?


Mon serveur est en Asie Heure de suivi avec UTC, il pourrait se casser pendant la moitié de l'année!


4 Réponses :


0
votes

En supposant que vous avez déjà analysé la date avec datetime.parseexact () (ou l'une des autres méthodes similaires) Vous pouvez appeler DateTime. Touniversaltime ()

EDIT: Peut-être que TimezoneInfo.ConvertiMetOutC est plus approprié: La méthode TouniversalTime convertit une valeur DateTime de l'heure locale en UTC. Pour convertir l'heure dans un fuseau horaire non local en UCC, utilisez la méthode TimeZoneInfo.ConvertiMeToutC (DateTime, TimeZoneInfo). Pour convertir un temps dont le décalage de l'UTC est connu, utilisez la méthode TouniversalTime.


2 commentaires

Je ne suis pas sûr de pouvoir faire confiance à mon parseexact.


-1. Touniversaltime () Je l'interprétera comme une fois dans votre fuseau horaire local, qui ajoute encore plus de cas de bord à traiter (je ne pense pas que Windows conserve des données de fuseau horaire historiques non plus).



6
votes

Je n'ai fait aucun c # depuis 2006, ce code ne compile probablement pas. Testez-le avant de voler! XXX


0 commentaires


3
votes

Cela devrait fonctionner

 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;
}


0 commentaires