2013-07-05 2 views
2

У меня есть C# блок кода здесь:Как проверить формат даты с #

string inputString = textBox1.Text; 
    DateTime dt; 
    try 
    { 
     if (DateTime.TryParseExact(inputString, "yyyyMMdd", null, DateTimeStyles.None, out dt) == true) 
     { 
      dt = dt.AddMonths(6); 
      textBox2.Text = dt.ToString("yyyyMMdd"); 
     } 
     else if (DateTime.TryParseExact(inputString, "yyyy.MM.dd", null, DateTimeStyles.None, out dt) == true) 
     { 
      dt = dt.AddMonths(6); 
      textBox2.Text = dt.ToString("yyyyMMdd"); 
     } 
    } 
    catch (Exception ex) { MessageBox.Show(ex.Message); } 

В принципе, то, что он делает, вводимые пользователем строка в TextBox1, по нажатию кнопки, C# будет проверить, какой формат даты в текстовом поле, затем добавьте 6 месяцев в дату и выведите его в текстовое поле2 в строковый формат yyyyMMdd. Как вы видите на данный момент, он принимает yyyyMMdd и yyyy.MM.dd и выполняет тот же процесс. Но моя проблема в том, что я до сих пор есть много форматов дата слева:

dd-MM-yy 
yyyy/mm/dd 
yyyy-mm-dd 
yy/mm/dd 

Я не хочу использовать или в моем IF заявлении. Есть ли способ, как WHATEVER формат, будет приниматься и выполнять этот процесс. Спасибо большое, ребята!

+2

Ваша проблема будет одной из двусмысленностей. Что следует интерпретировать следующим образом: 12/11/13. Это 12 ноября или 11 декабря? –

+1

13 ноября 2012 года. Приведенный конкретный список является фактически недвусмысленным из-за различий в пунктуации и двух/четырехзначных годах, хотя предполагается, что представленный список является полным списком всех форматов, которые они планируют использовать. –

+0

О, я вижу. Так что, может быть, я должен придерживаться того, если иначе? – QKWS

ответ

4

One of theoverloads of TryParseExact принимает в качестве второго параметра массив строк. Однако он не скажет вам, какой формат был использован. Если вам действительно нужна эта информация, то да, вам просто нужно запустить одноформатный TryParseExact с каждым желаемым форматом и посмотреть, какой из них работает.

И, конечно же, вам необходимо убедиться, что все форматы, которые вы разрешаете, недвусмысленны в отношении того, какие части являются днем, месяцем и годом, иначе вы можете разобрать 01/02/03 как любой из шести возможные даты.

+1

Ха, избили меня на 30 секунд. :) –

+0

Я получаю System.DateTime не содержит определения для TryParse. У меня уже есть .globalzation на моем пространстве имен. – QKWS

3

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

DateTime date; 
DateTime.TryParseExact("11-Nov-13", new[] { "yyyy-MM-dd","MM/dd/yy","dd-MMM-yy"}, null, DateTimeStyles.None, out date); 

Однако комментарий от Ли Тейлор все еще правильна в том, что если у вас есть форматы, которые могут быть неоднозначны, вы не знаете точно, что это неправильно.

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

+0

Большое спасибо за это. – QKWS

0

Вы можете проверить все возможные форматы с помощью использования CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns(), который присутствует в пространстве имен System.Globalization.

Вы можете использовать DateTime.TryParseExact который имеет перегрузку, которая принимает несколько форматов, чтобы попытаться синтаксический - ParseExact (строка с, строка [] форматов, поставщик IFormatProvider, DateTimeStyles стиль)

Пример кода:

private DateTime GetDate(string date) 
{ 
    DateTime dateTime = new DateTime(); 
    string[] formats = CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns(); 

    try 
    { 
     dateTime = DateTime.ParseExact(date, formats, CultureInfo.InvariantCulture, DateTimeStyles.None); 
    } 
    catch 
    { 
     throw ...; 
    } 

    return dateTime; 
} 
Смежные вопросы