Arhn - архитектура программирования

DateTime.TryParseExact постоянно возвращает false

У меня есть следующий код, который берет элемент в массиве строк и проверяет, соответствует ли он формату даты и времени. Эта проверка выполняется только для элементов 37, 38, 40, 41. Учитывая следующий код и отладочные распечатки, я вижу, что вывод соответствует синтаксическому анализу. Почему тогда он возвращает false?

Возможные входы:

05/03/2005 23:59:59.999
05/3/2005 23:59:59.999
5/03/2005 23:59:59.999
5/3/2005 23:59:59.999
etc...

Код:

lines[i] = lines[i] + " 23:59:59.999"; //YYYY-MM-DDThh:mm:ss[.mmm]
DateTime datetest;
if (DateTime.TryParseExact(lines[i], "MM/dd/yyyy HH:mm:ss.mmm", new CultureInfo("en-US"), DateTimeStyles.None, out datetest))
{
}
else
{
    //Log and Drop
    logfile.WriteLine(System.DateTime.Now.ToString("yyyy.MM.dd.HH.mm.ss") + ": Row #" + row + ", Column #" + (i) + " was not a date in the right format, dropping line. ");
    logfile.WriteLine("Original: " + lines[i]);
    Console.WriteLine("Date Wrong");
    Console.WriteLine("Date: " + lines[i]);
    string input = Console.ReadLine();
    continue;

}

Вывод в консоль:

Date Wrong
Date: 5/23/2004 23:59:59.999

ОБНОВЛЕНИЕ:

Я попытался изменить синтаксический анализ, чтобы вместо этого искать M/dd/yyyy. Однако вместо этого я получаю этот вывод.

Date Wrong
Date: 05/23/2005 23:59:59.999

ОБНОВЛЕНИЕ 2:

Хорошо, я попытался изменить синтаксический анализ, чтобы найти «M/d/yyyy HH:mm:ss.fff», как многие предлагали. Вывод, который я получаю сейчас:

Date Wrong
Date: 23.59.59.999

ОБНОВЛЕНИЕ 3:

Хорошо, теперь я попробовал «M/d/y H:m:s.fff», как было предложено, и я все еще получаю вывод как:

Date Wrong
Date: 05/23/2005 23:59:59.999
02.07.2014

  • ММ означает месяц с ведущим нулем, может быть, вы хотите М? 02.07.2014
  • .mmm неверно, используйте .fff 02.07.2014
  • Я хочу учитывать ведущие 0, поскольку они возможны. Можно ли сделать [М]М. я сомневаюсь в этом 02.07.2014
  • Хорошо, я попробовал это, проверьте мой отредактированный вопрос. 02.07.2014
  • Основываясь на вашем последнем редактировании (обновление 2), один из ваших входов является пустой строкой. Я думаю понятно, что он не будет разобран вашим методом. 02.07.2014
  • Это правда, я понятия не имею, почему тот, только с этим синтаксическим анализом, оказался пустой строкой... Я буду исследовать этот элемент дальше. 02.07.2014

Ответы:


1

Примечание. Ответ основан на исходной редакции вопроса до того, как он начал трансформироваться.

Почему тогда он возвращает false?

Формат MM требует двух цифр для обозначения месяца. Ваша строка даты имеет только одну цифру. Используйте формат месяца M. Строка формата миллисекунд должна быть fff, а не mmm.

Следующая строка формата будет анализировать ваш ввод

M/dd/yyyy HH:mm:ss.fff

Демонстрировать:

DateTime datetest;
Console.WriteLine(DateTime.TryParseExact("5/23/2004 23:59:59.999", 
    "M/dd/yyyy HH:mm:ss.fff", new CultureInfo("en-US"), DateTimeStyles.None, 
    out datetest));

который выводит

True

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

02.07.2014
  • Я хочу учитывать ведущие 0, поскольку они возможны. Можно ли сделать [М]М. я сомневаюсь в этом 02.07.2014
  • Вы можете использовать M, как я уже сказал. Это также будет учитывать первые цифры месяца 0. Вам также нужно будет использовать d в течение дня и так далее. 02.07.2014
  • Да, я пробовал это и пытался сделать один d вместо dd, но он перехватывается, когда я нажимаю что-то с начальным 0. 02.07.2014
  • Пожалуйста, прочитайте свой вопрос еще раз. Вы спросили, почему код в вопросе не удался. 02.07.2014
  • Это правда, но я пытаюсь найти что-то, что работает, потому что в настоящее время это все еще не работает. 02.07.2014
  • Нет!! Ввод в вопрос работает с изменениями, которые я предлагаю. Вы действительно ожидаете, что мы будем обрабатывать входные данные, которых нет в вопросе? 02.07.2014
  • Я добавил пример возможных входных данных к моему вопросу. Я добавил образец ввода к моему вопросу, не нужно злить Дэвида. 02.07.2014
  • Вы тратите наше время. Вы задали простой вопрос, на который мы ответили. Тогда вы изменили вопрос. Пожалуйста, верните вопрос в исходную форму и примите один из ответов. Затем потратьте некоторое время на то, чтобы понять, что вы действительно хотите спросить, и спросите об этом. 02.07.2014
  • Я бы подумал об этом, но ответ не обязательно был дан, поскольку пока ничего не сработало. Если бы было предоставлено что-то, что, как было доказано, было причиной ложного логического значения, я был бы более чем счастлив принять это. Но пока ничего не сработало, поэтому из того, что я вижу, нет никакого способа узнать, в чем действительно была проблема. 02.07.2014
  • Теперь это сработало, спасибо за редактирование вашего вопроса после моего последнего комментария, чтобы включить рабочий код. Я буду рад принять ваш ответ, поскольку вы показали, что было не так и что нужно было исправить. Спасибо. 02.07.2014

  • 2

    У вас неправильный формат даты и времени, который вы пытаетесь проанализировать. Измените его на: "M/dd/yyyy HH:mm:ss.fff"

    В ответ на комментарий:

    DateTime datetest;
    var dateTimes = new [] { "05/03/2005 23:59:59.999", "05/3/2005 23:59:59.999", "5/03/2005 23:59:59.999", "5/3/2005 23:59:59.999" };
    
    foreach(var dateTimeToParse in dateTimes)
        if (DateTime.TryParse("5/3/2005 23:59:59.999", new CultureInfo("en-US"), DateTimeStyles.None, out datetest))
            Console.WriteLine(dateTimeToParse + " parses to: " + datetest);
        else
            Console.WriteLine("FAIL!");
    

    Работает на моей машине:

    03.05.2005 23:59:59.999 разбирает на: 2005-05-03 23:59:59

    03/05/2005 23:59:59.999 разбирает на: 2005-05-03 23:59:59

    03.05.2005 23:59:59.999 разбирает на: 2005-05-03 23:59:59

    03.05.2005 23:59:59.999 разбирает на: 2005-05-03 23:59:59

    02.07.2014
  • Да, я пробовал это, но он перехватывается, когда я нажимаю что-то с ведущим 0. 02.07.2014
  • @Kyle Смотрите конечный .fff вместо вашего .mmm 02.07.2014
  • @Kyle Тогда не используйте ParseExact! 02.07.2014
  • Достаточно справедливо, что бы вы предложили, что позволяет определить какую-то схему? 02.07.2014

  • 3

    Я не вижу содержимого строк [I], но несоответствие между форматом, описанным в комментарии, и форматом, используемым в TryParse, может быть вашей проблемой:

    lines[i] = lines[i] + " 23:59:59.999"; //YYYY-MM-DDThh:mm:ss[.mmm]
    ...
    if (DateTime.TryParseExact(lines[i], "MM/dd/yyyy HH:mm:ss.mmm",
    
    02.07.2014
  • Я хочу учитывать ведущие 0, поскольку они возможны. Можно ли сделать [М]М. я сомневаюсь в этом 02.07.2014

  • 4

    Используя это (как уже предложили Ганс и Дэвид):

    class Program
    {
        static void Main(string[] args)
        {
            List<String> datetimeList = new List<string>();
            datetimeList.Add("05/03/2005 23:59:59.999");
            datetimeList.Add("05/3/2005 23:59:59.999");
            datetimeList.Add("5/03/2005 23:59:59.999");
            datetimeList.Add("5/3/2005 23:59:59.999");
            DateTime datetest;
            foreach (string s in datetimeList)
            {
                if (!DateTime.TryParseExact(s, "M/d/yyyy HH:mm:ss.fff", new CultureInfo("en-US"), DateTimeStyles.None, out datetest))
                {
                    Console.WriteLine("Error");
                }
                else
                {
                    Console.WriteLine("Success");
                }
            }
            Console.Read();
        }
    }
    

    печатает 4 раза «Успех».

    Это только доказательство концепции, я не хочу никаких голосов.

    02.07.2014
  • Какой интересный подход, и удачный для этой выборки данных. Но это были просто примеры, если моя дата была в этих форматах, но с неизвестными значениями. Что-то вроде /*/ 23:59:59.999 это явно не сработает. Есть ли способ учесть эти подстановочные знаки? 02.07.2014
  • подстановочные знаки для чего? Как дату угадать? Как это должно работать? 02.07.2014
  • Подстановочные знаки? Вы над нами издеваетесь!!!!!! Ради Бога, задайте вопрос и придерживайтесь его. Пожалуйста, перестаньте менять свое мнение относительно того, о чем вы спрашиваете. Прошу вернуть вопрос в исходную форму. 02.07.2014
  • @DavidHeffernan Разве у тебя нет хрустального шара в руках ;-) 02.07.2014
  • @DavidHeffernan Я не меняю вопрос, это был простой вопрос, основанный на этом ответе. Я согласен, что это работает, но только с демонстрационными данными. Вопрос заключался в том, чтобы выяснить, можно ли адаптировать это решение для учета других чисел, когда они неизвестны. Мне жаль, что вы считаете, что я трачу ваше время впустую, но вы не должны быть грубыми. Ничто не мешает тебе уйти, ты ведь не привязан сюда. Я не нарушаю правила здесь. Я публикую дополнительные вопросы, поскольку на первоначальный вопрос не было ответа, и я подумал, что обновления, возможно, помогут нам всем разобраться в проблеме. 02.07.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..