Как я могу конвертировать Paypal в формате ЧЧ: ММ: СС ДД Ммм (.) ГГГГ PST / PDT в C # UTC DateTime? - PullRequest
9 голосов
/ 28 июня 2011

Я хотел бы записать дату платежа в этом формате в базу данных SQL Server.

Обновление. Инстинкт был прав в этом.Нашел решение здесь: http://www.codeillustrator.com/2010/03/converting-paypal-paymentdate-to-net.html, проверка ... конечно, если Paypal когда-либо покинет Западное побережье, у меня будут проблемы.Есть ли лучший способ разобрать это?Может быть, с 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 DateTime и обрабатывать любой часовой пояс.Также приведенный выше код не обрабатывает PDT должным образом (при преобразовании в UTC).

Update2. По-видимому, по крайней мере в предыдущих версиях песочница возвращала бы "Feb."в то время как в прямом эфире возвращается "Фев".Лол.Кто-нибудь, спасите меня!

Обновление 3. Ссылка на версию Regex 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;
}

Ответы [ 4 ]

6 голосов
/ 28 июня 2011

Я не делал C # с 2006 года, поэтому этот код, вероятно, не компилируется.Проверьте это, прежде чем летать!

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);
}
3 голосов
/ 23 апреля 2013

Это должно работать

 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;
}
2 голосов
/ 22 сентября 2011

Код в этом посте работает нормально: 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;
    }
}

(ответ на этот же вопрос в ответе: Как привести эту дату и сохранить в базе данных )

0 голосов
/ 28 июня 2011

Предполагая, что вы уже проанализировали дату с помощью DateTime.ParseExact () (или одним из других подобных методов), вы можете вызвать DateTime.ToUniversalTime ()

РЕДАКТИРОВАТЬ: возможно, TimeZoneInfo.ConvertTimeToUtc более уместно: метод ToUniversalTime преобразует значение DateTime из местного времени в UTC.Чтобы преобразовать время в нелокальном часовом поясе в UTC, используйте метод TimeZoneInfo.ConvertTimeToUtc (DateTime, TimeZoneInfo).Чтобы преобразовать время, для которого известно смещение от UTC, используйте метод ToUniversalTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...