2009-12-11 4 views
-1
using System; 
using System.Globalization; 

namespace ConsoleApplication20 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     {  

string[] formats ={ 
      "MM/dd/yyyy HH:mm:ss tt", 
      "MM/dd/yyyy HH:mm:ss", 
      "MM/dd/yyyy H:mm:ss tt", 
      "MM/dd/yyyy H:mm:ss", 
      "M/dd/yyyy HH:mm:ss tt", 
      "M/dd/yyyy HH:mm:ss", 
      "M/dd/yyyy H:mm:ss tt", 
      "M/dd/yyyy H:mm:ss", 
      "MM/d/yyyy HH:mm:ss tt", 
      "MM/d/yyyy HH:mm:ss", 
      "MM/d/yyyy H:mm:ss tt", 
      "MM/d/yyyy H:mm:ss", 
      "M/d/yyyy HH:mm:ss tt", 
      "M/d/yyyy HH:mm:ss", 
      "M/d/yyyy H:mm:ss tt", 
      "M/d/yyyy H:mm:ss"  
      }; 
     string date1 = "11/08/2008 4:00:49"; 

     DateTime result; 
     if (DateTime.TryParseExact(date1, formats, 
          new CultureInfo("en-US"), 
          DateTimeStyles.None, 
          out result)) 
     { 
      DateTime startTime = result; 
     } 

     Console.Write(startTime); 

    } 
    } 
} 

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



Thanx за помощь и поддержку, Rik, Phillip, Joel и Kent и все остальные ..C#: Какая ошибка в этом коде?

+0

Как этот код даже скомпилировать? – leppie

ответ

8

Вы должны объявить (и инициализация)

DateTime startTime 

Вне заявление IF или

Console.WriteLine(startTime) 

Внутри оператора IF.

Вы можете попробовать изменить значение параметра DateTimeStyles либо в AssumeLocal, либо в AssumeUniversal (в зависимости от ваших потребностей), чтобы исключить отсутствие спецификации часового пояса.

+1

@Brian: DateTime является структурой и поэтому не может быть нулевым. Однако он может быть неинициализирован, что, вероятно, тоже не очень хорошо. – Rik

+1

@Aravind: попробуйте использовать другое значение enum для DateTimeStyles. – Rik

+2

Я предполагаю либо AssumeLocal, либо AssumeUniversal, в зависимости от ваших потребностей. – Rik

20

Вы объявили начальное время в рамках другого блока, из которого вы его распечатываете. Попробуйте изменить на:

if (DateTime.TryParseExact(date1, formats, 
    new CultureInfo("en-US"), 
    DateTimeStyles.None, 
    out result)) 
{ 
    DateTime startTime = result; 
    Console.Write(startTime); 
} 
+0

+1 для первого правильного ответа. – Wade73

+0

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

2

только начальный промежуток определен в объеме, что если оператор переместить Console.Write в, если заявление или объявить переменную над ней

2

Причина ошибки компиляции заключается в том, что startTime выходит за пределы области видимости.

Способ исправить вашу проблему должным образом, но должен напечатать result, а не в if.

2

startTime заявлен только в том случае, если результат вашего заявления if верен.

Console.Write(startTime) находится за пределами этого if и поэтому если if не возвращает истину, startTime обыкновение существовать.

2

Вы объявляете и запускаете startTime внутри своего if. Попробуйте

 DateTime result; 
     DateTime startTime = new DateTime; 
     if (DateTime.TryParseExact(date1, formats, 
          new CultureInfo("en-US"), 
          DateTimeStyles.None, 
          out result)) 
     { 
      startTime = result; 
     } 

     Console.Write(startTime); 
5

Kent Boggart пригвоздил ошибку компилятора, но я заметил еще одну проблему с вашими форматами. Вы смешиваете комбинации разных форматов месяц, день, час и am/вечера, но вы используете только верхний регистр «H» для ваших часовых форматов. Верхний регистр «H» означает использование 24-часового времени, а нижний регистр «h» означает использование 12-часового времени. Таким образом, вы должны, вероятно, только в верхнем регистре «H» на образцах, где вы не имеете опцию «TT», как это:

string[] formats ={ 
     "MM/dd/yyyy hh:mm:ss tt", 
     "MM/dd/yyyy HH:mm:ss", 
     .... 
}; 
+0

ой действительно? .. У меня было подобное сомнение .. но не было выяснено с .. чем Q очень .. (извините, но может быть только ОДИН лучший ответ ..) так +1 :): P –

3

Вот фрагмент кода, который работает - нет ошибки компилятора, и «если '. Обратите внимание, что вам нужно положить Console.ReadKey() в конец файла, чтобы окно cmd не исчезло слишком быстро.

using System; 
using System.Globalization; 

namespace so1888431_timestringparse 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] formats ={ 
      "MM/dd/yyyy HH:mm:ss tt", 
      "MM/dd/yyyy HH:mm:ss", 
      "MM/dd/yyyy H:mm:ss tt", 
      "MM/dd/yyyy H:mm:ss", 
      "M/dd/yyyy HH:mm:ss tt", 
      "M/dd/yyyy HH:mm:ss", 
      "M/dd/yyyy H:mm:ss tt", 
      "M/dd/yyyy H:mm:ss", 
      "MM/d/yyyy HH:mm:ss tt", 
      "MM/d/yyyy HH:mm:ss", 
      "MM/d/yyyy H:mm:ss tt", 
      "MM/d/yyyy H:mm:ss", 
      "M/d/yyyy HH:mm:ss tt", 
      "M/d/yyyy HH:mm:ss", 
      "M/d/yyyy H:mm:ss tt", 
      "M/d/yyyy H:mm:ss"  
      }; 
      string date1 = "11/08/2008 4:00:49"; 

      DateTime result; 
      if (DateTime.TryParseExact(date1, formats, 
           new CultureInfo("en-US"), 
           DateTimeStyles.None, 
           out result)) 
      { 
       DateTime startTime = result; 
       Console.Write(startTime); 
      } 
      Console.ReadKey(); 
     } 
    } 
}