Может ли C # преобразовать эти плохо отформатированные теги месяца / года в набор объектов datetime? - PullRequest
0 голосов
/ 10 июня 2011

У меня есть следующие выпадающие списки в этом случае аукционных экземпляров, но нет никакого стандарта для присвоения им имен: <select name="marketId" onchange="javascript:reload()"><option value="27" selected="selected">Jul08Auc</option> <option value="61">Sep08Auc</option> <option value="623">Dec10Auc</option> <option value="743">Apr11Auc</option> <option value="66">Oct08Auc</option> <option value="81">Nov08Auc</option> <option value="287">October 2009</option> <option value="703">Mar11Auc</option> <option value="222">Jun09Auc</option> <option value="383">Mar10Auc</option> <option value="423">Apr10Auc</option> <option value="523">August 2010</option> <option value="21">Jun08Auc</option> <option value="105">Jan09Auc</option> <option value="142">March 2009</option> <option value="202">May 2009</option> <option value="303">November 2009</option> <option value="449">May10Auc</option> <option value="463">June 2010</option> <option value="503">July 2010</option> <option value="663">Jan11Auc</option> <option value="763">May11Auc</option> <option value="122">Feb09Auc</option> <option value="282">September 2009</option> <option value="41">Aug08Auc</option> <option value="543">September 2010</option> <option value="603">Nov10Auc</option> <option value="247">July 2009</option> <option value="346">Jan10Auc</option> <option value="363">Feb10</option> <option value="683">Feb11Auc</option> <option value="583">Oct10Auc</option> <option value="101">Dec08Auc</option> <option value="182">April 2009</option> <option value="262">August 2009</option> <option value="323">December 2009</option></select>

Теперь мой вопрос такой, я собираюсь вернуть один из этих вариантов обратно впочтовую форму, и мне нужно изменить перечисленные в ней месяц и год в симпатичный объект DateTime.

Некоторые из них имеют ссылку «Oct10Auc», а некоторые похожи на «Декабрь 2009», что означаетне было никакого контроля над форматированием даты.

Я хочу взять «Oct10Auc», посмотреть код и сказать: «О, да, вы хотите дату 10/1/2010,или возьмите сентябрь 2009 года и скажите «Вы хотите дату 9/1/2009».

Моя цель - НЕ писать огромный анализатор строк, который пытается выяснить, на какое время штампа он смотрит, изатем расшифруйте его.

Интересно, справится ли C # или любой доступный API с этим?

Ответы [ 3 ]

5 голосов
/ 10 июня 2011

Я бы построил список форматов, затем вызвал бы DateTime.TryParseExact для каждого включения.

static DateTime Parse(string dateString)
{
 string[] formats = new [] {"MMMYY\A\u\c", "MMMM YYYY"};
 DateTime parsedDate = new DateTime();
 foreach (string fmt in formats)
 {
    if (DateTime.TryParseExact (dateString, fmt, null, DateTimeStyles.Default, out parsedDate)
       return parsedDate;
 }
 throw new FormatException ();
}

Вот полный список параметров формата . Вы можете вставлять экранированные символы (такие как вы AUC).

1 голос
/ 10 июня 2011

Достаточно легко проверить это в C #.Запустите быстрое консольное приложение, передайте ему значения даты и посмотрите, работает ли с ними DateTime.TryParse ().Единственное, что вы хотите сделать заранее, это заменить строку «Auc» на «».

Но на самом деле похоже, что даты имеют только 2 шаблона: Месяц Год MonYrAuc

DateTime.TryParse () должно соответствовать месяцу.Для MonYr вам просто нужно поставить пробел между Mon и Yr, затем добавить «20» перед Yr, предполагая, что это всего лишь 2000-е годы.

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

Вы можете использовать функцию DateTime.ParseExact. Просто создайте действительный аргумент format, используйте InvariantCulture в качестве IFormatProvider и передайте свою строку в функцию.

Поскольку у вас есть два формата, вы можете перехватить исключение FormatException и попытаться проанализировать дату в другом формате.

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