2013-03-27 2 views
3

Может ли кто-нибудь увидеть, что я делаю неправильно, я пытаюсь проанализировать дату, чтобы обеспечить ее действительную дату, если это так преобразовать ее в требуемый формат.DateTime.TryParseExact CultureInfo.InvariantCulture

Я пробовал разные способы сделать это, но все возвращается 01/01/0001 00:00:00.

значение строки parseArrivalDate = 02/02/2013

DateTime ukDateFormat; 
string ukFormat = "0:ddd, MMM d, yyyy";  
DateTime.TryParseExact(parseArrivalDate, ukFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out ukDateFormat);  
DateTime test = ukDateFormat; 

--------------------------------- ---- EDIT -------------------------------

ОК, извините, я не очень хорошо объяснил это , Если я войду в британский формат, скажем, 27/02/2013, и когда у меня был формат Великобритании в формате dd/MM/yyyy, он работал нормально, проблема была, когда я входил в США или какой-либо другой формат, он возвращал неправильную дату, поэтому я был это проблема.

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

Надежда, что имеет смысл Благодаря

+1

что является результатом TryParse? как бы это работать, если вы только проходите parseArrivalDate и ukFormat? –

ответ

1

ваша строка даты: 02/02/2013 и формат вы используете "0:ddd, MMM d, yyyy", который является неправильным, оно должно быть MM/dd/yyyy, если его месяц первый.

DateTime ukDateFormat; 
string ukFormat = "MM/dd/yyyy";  
DateTime.TryParseExact(parseArrivalDate, ukFormat,CultureInfo.InvariantCulture,DateTimeStyles.None, out ukDateFormat);  
DateTime test = ukDateFormat; 

Если дата вы указали день содержит первый то месяц, а затем использовать формат "dd/MM/yyyy", Кстати, вы можете с помощью одного d и M как для одной цифры и двузначных цифр дня/месяца.

В настоящее время вы получаете DateTime.MinValue, так как разбор сбоев из-за неверного формата.

+0

Привет редактированный вопрос – CareerChange

1

Я понятия не имею, что вы ожидаете, но ваша строка ввода не соответствует вашему шаблону ukFormat! Так что это абсолютно правильное поведение.

Изменить ваш шаблон на ""dd/MM/yyyy"" сделать TryParseExact работы.

+0

Привет редактированный вопрос – CareerChange

1

Ваш предоставленный формат выглядит немного странно. Попробуйте заменить его с этим

string ukFormat = "dd/MM/yyyy";  

И читать documentation на этом.

+1

Привет редактированный вопрос – CareerChange

4

Ваша строка

"0:ddd, MMM d, yyyy" 

имеет ряд 0, двоеточие :, и формат, соответствующий

"Wed, Mar 27, 2013" 

, например, если культура "en-GB" ("Английский (United Kingdom)").Это, вероятно, происходит от String.Format, Console.WriteLine или аналогичного вызова метода, где она ставится в скобки {} для форматирования текста, как в

Console.WriteLine("The date {0:ddd, MMM d, yyyy} was selected.", someDateTime); 

Она будет работать с кодом, как:

string arrivalDateString = "Wed, Mar 27, 2013"; 

... 

DateTime result; 
string yourFormat = "ddd, MMM d, yyyy"; // no "0:" part 
bool isOK = DateTime.TryParseExact(arrivalDateString, yourFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out result);  
if (isOK) 
{ 
    // Worked! Answer is in 'result' variable 
} 
else 
{ 
    // Didn't work! 'result' variable holds midnight 1 January 0001 
} 

Формат, который соответствует "27/03/2013", составляет "dd/MM/yyyy" (или "d/M/yyyy"). Формат, который соответствует "03/27/2013", составляет "MM/dd/yyyy" (или "M/d/yyyy").

Это не возможно иметь один метод, который обрабатывает оба стиля даты, так как строка, как

"01/04/2013" /* ambiguous */ 

может означать либо

  • 1 апреля 2013
  • 4 января 2013

так что это неоднозначно, и мы никак не можем сказать, что означает дата. См. Также Wikipedia: Calendar date → Date format.

0

Спасибо всем за то, что помогли мне понять, где я ошибся, код ниже - это то, что я придумал, хотя и не идеальный как 03/06/2013. Великобритания отличается от значения 03/06/2013 США.

Я добавил текст над текстовым полем и попросил людей использовать формат dd/mm/yyyy.

string getArrivalDate = ArrivalDate; 
        string getDepartureDate = DepartureDate; 

        string dteFormat  = "dd/MM/yyyy"; 
        DateTime result; 
        string arrivalDateParse; 
        string departureDateParse; 

        bool arrival = DateTime.TryParseExact(getArrivalDate, dteFormat, new CultureInfo("en-GB"), DateTimeStyles.None, out result); 
        if (arrival) 
         { 
         arrivalDateParse = getArrivalDate; 
         } 
        else 
         { 
         arrivalDateParse = "notvalid"; 
         } 

        bool depart = DateTime.TryParseExact(getDepartureDate, dteFormat, new CultureInfo("en-GB"), DateTimeStyles.None, out result); 
        if (depart) 
         { 
         departureDateParse = getDepartureDate; 
         } 
        else 
         { 
         departureDateParse = "notvalid"; 
         } 

        if (arrivalDateParse == "notvalid" || departureDateParse == "notvalid") 
         { 
         if (Request.IsAjaxRequest()) 
          { 
          return Json(new { Confirm = "Date not in correct format" }, JsonRequestBehavior.AllowGet); 
          } 
         else 
          { 
          TempData["Error"] = "Sorry your arrival date or departure date is not a valid format, please enter date as dd/mm/yyyy example 02/12/2013"; 

          return View("~/Views/Shared/Error.cshtml"); 
          } 

Если кто-то может улучшить код, было бы полезно.

Благодаря

Джордж