Анализ даты и времени не работает в Windows 7: строка не была распознана как допустимая дата и время

Прежде чем я начну объяснять, я должен сказать, что испробовал все возможные решения этой проблемы, представленные в stackoverflow. Но не работает в виндовс 7.

В Windows 7 не работает синтаксический анализ даты и времени. я пробовал следующие фрагменты кода

DateTime.ParseExact(arr[TransactionDateIndex], "M/dd/yyyy h:mm:ss tt", null);
DateTime.ParseExact(arr[TransactionDateIndex], "M/d/yyyy h:mm:ss tt",CultureInfo.InvariantCulture);
DateTime.Parse(DateTime.Parse(arr[TransactionDateIndex]).ToString("M/d/yyyy h:mm:ss tt"),CultureInfo.InvariantCulture);  

У меня есть входной файл, в котором есть столбец даты транзакции, и он может быть в любом допустимом формате даты и времени, прямо сейчас в файле его (MM/dd/YYYY), который мне нужно преобразовать в «M/d/yyyy h: mm:ss tt".
При запуске в XP этот код работает нормально, но в Windows 7 даже после попытки ParseExact он показывает ошибку.
Даже если я использую

if (DateTime.TryParse(input, out dateTime))  
{
}

При работе в Windows 7 несколько записей будут считаться недействительными, но те же самые вещи будут проанализированы в XP.


person user1942809    schedule 23.02.2015    source источник
comment
В точном анализе даты и времени вы предоставляете формат, который хотите проанализировать, а не формат, который вы хотите проанализировать.   -  person Mahesh    schedule 23.02.2015
comment
Не видя ошибочных входных данных, я мало что могу здесь сказать.   -  person lc.    schedule 23.02.2015
comment
Однако yyyy-MM-dd также работает.   -  person Ismail Gunes    schedule 23.02.2015


Ответы (2)


Если ваш текущий формат даты и времени MM/dd/yyyy, вы должны использовать как

   string dateString = "02/15/2015"
   DateTime dateValue = DateTime.ParseExact(dateString , "MM/dd/yyyy", CultureInfo.InvariantCulture);

И если вы хотите преобразовать это в какой-то другой формат, как вы упомянули M/d/yyyy h:mm:ss tt, вы можете добавить .Tostring('M/d/yyyy h:mm:ss tt') к дате.

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

Вы можете использовать что-то вроде следующего, но имейте в виду, что несколько форматов могут анализировать одну и ту же дату. Например, 11.10.12 можно проанализировать как yyyy/MM/dd или MM/dd/yyyy, которые являются допустимыми форматами даты в США. MM/dd/yyyy встречается чаще, поэтому он отображается первым в списке и именно он возвращается приведенным ниже кодом (если вы используете его с культурой США вместо культуры в примере).

 string testValue = "02/15/2015";

 DateTime result; 
 CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI"); 
 string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();
 Console.WriteLine(String.Join("\r\n", fmts)); 
 if (DateTime.TryParseExact(testValue, fmts, ci,    DateTimeStyles.AssumeLocal, out result)) { 
      Console.WriteLine(result.ToLongDateString());   
 }

И если CultureInfo также не исправлено, то вы должны получить все доступные контркультуры, а затем получить от них все форматы, а затем разобрать дату и время.

person Mahesh    schedule 23.02.2015
comment
Я даже пытался сначала проанализировать строку с действительной датой и временем, скажем, MM/dd/yyyy с помощью ' Datetime.ParseExact', а затем преобразовать ее в M/dd/yyyy h:mm:ss tt< /i> но такая же ошибка возникает при анализе таких значений, как 21.12.2013, 12.02.2013, 13.02.2013 (допустимые форматы) и т. д. В противном случае для таких значений, как 12.02.2013, код работает хорошо даже в Windows 7. Я действительно не могу понять, где я ошибаюсь. - person user1942809; 23.02.2015
comment
В 12/21/2013 этом случае он должен преобразовываться в дату. Но в этом 02-12-2013 or 2/13/2013 ваш точный формат синтаксического анализа и форматы даты не совпадают, поэтому ошибка, если ваша культура исправлена, вам следует попробовать приведенный ниже код для синтаксического анализа всех доступных форматов. Сначала выполните только синтаксический анализ, чтобы проверить, правильно ли проанализированы все даты, а затем преобразуйте их в нужный формат. - person Mahesh; 23.02.2015
comment
Извините за беспокойство. Еще один вопрос, почему он отлично работает в xp.даже с этим кодом ' DateTime.Parse(DateTime.Parse(arr[TransactionDateIndex]).ToString(M/d/yyyy h:mm:ss tt),null ); ' или это 'DateTime.Parse(DateTime.Parse(arr[TransactionDate]).ToString(M/d/yyyy h:mm:ss tt)); код. даже если точный формат синтаксического анализа и формат даты не соответствуют, он фактически работает в xp, т.е. - person user1942809; 23.02.2015
comment
Этого не должно быть. Попробуйте выполнить отладку на XP и выясните, почему это работает, если нет, то задайте другой вопрос с подробностями. У меня нет подробностей о том, что происходит с вашим кодом, поэтому я не могу дать вам определенный ответ. - person Mahesh; 23.02.2015
comment
Большое спасибо за помощь. - person user1942809; 23.02.2015

Может случиться так, что указана неверная дата в

arr[TransactionDateIndex]

Поэтому сначала попробуйте жестко запрограммировать дату. затем вы можете проверить все значения, переданные в date.parse, с помощью debug.write() (приложение для Windows) или trance.write() (asp.net), используя класс отладки в System.Diagnostics, и проверить окно вывода на наличие любой несовместимой даты формат.

Наконец, вы можете разместить этот код в верхней части метода, где появляется этот код:

System.Threading.Thread.CurrentCulture = CultureInfo.InvariantCulture;
person Bharat    schedule 23.02.2015
comment
Это должен был быть комментарий. Если вы говорите ему сделать отладку. - person Mahesh; 23.02.2015